阻止Perl XS模块无声地回退到纯perl

Øyv*_*aar 6 perl cpan module perl-module xs

似乎CPAN上的一些(很多?)模块部分使用XS在C中实现,并且如果需要可以回退到纯perl实现.虽然这很聪明,但它显然会损害性能,我想知道它发生了所以我可以解决问题.

是否有停止或检测此类后备的一般方法?

有关此行为的示例,请查看(非常方便)Date :: Simple(代码段)

One*_*ete 6

任何解决方案都必须基于每个模块(因为决定使用哪个实现由父模块本身,而不是Perl中的某些机制).在您引用的情况下,在use语句之后检查$ Date :: Simple :: NoXs的值将告诉您是否正在使用XS.

use Date::Simple;
die "not using XS for Date::Simple\n" if $Date::Simple::NoXs;
Run Code Online (Sandbox Code Playgroud)

例如,要检测Scalar :: Util是否使用XS或纯Perl版本,您必须检查是否存在双变量函数.

use Scalar::Util;
die "not using XS for Scalar::Util\n" unless if @Scalar::Util::EXPORTFAIL;
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 5

这是一个非常好的功能请求.遗憾的是,如果模块作者没有编程,perl不知道该模块是否具有XS或Pure Perl(PP)变体以及是否通过回退加载了引擎.

你提出的这个例子是因为它们被打包在同一个发行版和模块中,并且它们都在内部完成.我修补它以遵循CPAN惯例:DateSimple,这需要DateSimple::PP并建议DateSimple::XS.这是Text::CSV和其他人一样的.此方法允许::XS直接使用构造函数强制使用,XS同时甚至不安装pureperl变体.或者,您可以将它们打包在一起 - 这就是Template::Stash它的作用Template::Stash::XS.实现统一的第一步是获得ad-hoc功能.

这样的事情可能很容易做到,如果模块都在一个拉Moose::Role所提供的一些基本属性_xs_class_name,_pp_class_nameengine_override.但是,再一次,到目前为止,甚至没有任何内容可以实现统一的API来实现这一目标.