CPAN のいくつかの (多くの?) モジュールは、XS を使用して部分的に C で実装されているようで、必要に応じて純粋な perl 実装にフォールバックできます。これは賢明ですが、明らかにパフォーマンスが低下する可能性があります。問題を解決できるように、それが発生することを知りたいです。
このタイプのフォールバックを停止または検出する一般的な方法はありますか?
この動作の例については、(非常に便利な) Date::Simple (コード スニペット)をご覧ください。
CPAN のいくつかの (多くの?) モジュールは、XS を使用して部分的に C で実装されているようで、必要に応じて純粋な perl 実装にフォールバックできます。これは賢明ですが、明らかにパフォーマンスが低下する可能性があります。問題を解決できるように、それが発生することを知りたいです。
このタイプのフォールバックを停止または検出する一般的な方法はありますか?
この動作の例については、(非常に便利な) Date::Simple (コード スニペット)をご覧ください。
どのソリューションもモジュールごとに行う必要があります(使用する実装の決定は、Perlのメカニズムではなく、親モジュール自体によって行われるため)。引用した場合、useステートメントの後で$ Date :: Simple :: NoXsの値をチェックすると、XSが使用されているかどうかがわかります。
use Date::Simple;
die "not using XS for Date::Simple\n" if $Date::Simple::NoXs;
たとえば、Scalar :: UtilがXSまたは純粋なPerlバージョンを使用しているかどうかを検出するには、dualvar関数の存在を確認する必要があります。
use Scalar::Util;
die "not using XS for Scalar::Util\n" unless if @Scalar::Util::EXPORTFAIL;
これは本当に良い機能リクエストです。残念ながら、モジュールの作成者がプログラムしたものを除いて、perlは、モジュールにXSまたはPure Perl(PP)のバリアントがあるかどうか、およびエンジンがフォールバックによってロードされたかどうかを認識していません。
あなたが提起するこの例は、それらが同じディストリビューションとモジュールにパッケージ化されているという効果によって複雑になり、それはすべて内部で行われます。CPANの規則に従うようにパッチを適用します。DateSimple
これには、が必要でありDateSimple::PP
、推奨されDateSimple::XS
ます。これはText::CSV
、他の人がそれを行う方法です。このメソッドを使用すると、::XS
コンストラクターを直接使用XS
して、pureperlバリアントを強制的に使用すると同時に、インストールする必要がなくなります。または、それらを一緒にパッケージ化することもできます。これは、でTemplate::Stash
行うことTemplate::Stash::XS
です。何かを統一するための最初のステップは、機能をアドホックにすることです。
Moose::Role
この種のことは、いくつかの基本的な属性、、、およびを提供する_xs_class_name
モジュール_pp_class_name
がすべてプルインされている場合に簡単に実行できますengine_override
。しかし、繰り返しになりますが、これを達成するために統合APIをシードすることさえ今のところありません。
関数が XSUB CV であることを検出する一般的な方法があります。CV の XSUB スロットが非 NULL ポインタを返すかどうかを確認するだけです。
たとえば、My::func をチェックします。
sub isxsub {
use B;
my $name = shift;
my $cv = B::svref_2object(\&$name);
return !!$cv->XSUB;
}