6

CPAN のいくつかの (多くの?) モジュールは、XS を使用して部分的に C で実装されているようで、必要に応じて純粋な perl 実装にフォールバックできます。これは賢明ですが、明らかにパフォーマンスが低下する可能性があります。問題を解決できるように、それが発生することを知りたいです。

このタイプのフォールバックを停止または検出する一般的な方法はありますか?

この動作の例については、(非常に便利な) Date::Simple (コード スニペット)をご覧ください。

4

3 に答える 3

6

どのソリューションもモジュールごとに行う必要があります(使用する実装の決定は、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;
于 2010-09-07T14:40:55.147 に答える
5

これは本当に良い機能リクエストです。残念ながら、モジュールの作成者がプログラムしたものを除いて、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をシードすることさえ今のところありません。

于 2010-09-07T14:44:23.517 に答える
1

関数が XSUB CV であることを検出する一般的な方法があります。CV の XSUB スロットが非 NULL ポインタを返すかどうかを確認するだけです。

たとえば、My::func をチェックします。

sub isxsub {
    use B;
    my $name = shift;
    my $cv = B::svref_2object(\&$name);
    return !!$cv->XSUB;
}
于 2010-12-31T08:27:27.537 に答える