perl - 停止从静默回退到纯Perl的Perl XS模块

  显示原文与译文双语对照的内容
0 0

它似乎部分( 多) 模块是在C 中部分实现的,如果需要的话,可以返回到纯perl实现。 虽然这很聪明,但是很明显会影响性能,我想知道这样做,以便解决问题。

是否有一般的方法来停止或者检测这种类型的后备?

有关这种行为的示例,请看一下( 非常方便) Date::Simple ( 代码 Fragment )

时间: 原作者:

0 0

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


use Date::Simple;
die"not using XS for Date::Simplen" if $Date::Simple::NoXs;

比如要检测 Scalar::Util 是否使用了XS或者纯Perl版本,你必须检查dualvar函数是否存在。


use Scalar::Util;
die"not using XS for Scalar::Utiln" unless if @Scalar::Util::EXPORTFAIL;

原作者:
0 0

这是一个非常好的。 不幸的是,如果模块作者编写了,Perl没有知道模块是x 还是纯 Perl ( PP ) 变体,如果引擎通过回退。

这个例子由于它们被包装在同一发行版和模块中,并且在内部完成了。 我将修补它以遵循CPAN约定: DateSimple,它需要 DateSimple::PP 并推荐 DateSimple::XS 。 这就是 Text::CSV 插件的工作方式,而其他。 这里方法允许使用 ::XS 构造函数直接强制使用 XS,同时甚至不安装PurePerl变量。 或者,你可以将它们打包在一起,这是 Template::StashTemplate::Stash::XS does的what 。 获得任何统一的第一步是获得特殊的功能。

如果模块全部在提供了一些基本属性 _xs_class_name_pp_class_nameengine_overrideMoose::Role 中,那么就很容易完成这种事情。 但是,同样,现在也没有一个种子是统一API来实现这个。

原作者:
0 0

有一种通用的方法来检测你的函数是 XSUB CV 。 只要检查CV的XSUB插槽是否返回非空指针。

e.g 。检查 My::func


sub isxsub {
 use B;
 my $name = shift;
 my $cv = B::svref_2object(&$name);
 return!!$cv->XSUB;
}

...