2010-09-07 6 views
6

Кажется, некоторые (многие?) Модули на CPAN частично реализованы на C с использованием XS и при необходимости могут вернуться к реализации с чистым перлом. Хотя это разумно, это может явно ухудшить производительность, и я хотел бы знать, что это происходит, поэтому я могу исправить эту проблему.Остановка модулей Perl XS от бесшумного падения до чистого перла

Есть ли общий способ остановки или обнаружения этого типа резерва?

В качестве примера такого поведения взглянуть на (очень удобно) Date::Simple (code snippet)

+1

Я ответил на общий подход, но в качестве опции в стороне 'DateTime' является defacto perl distro для представления дат. –

+1

@ Evan Carroll, DateTime может быть самым популярным (и полнофункциональным), но вряд ли это единственный человек. Существует много модулей даты на Perl. – cjm

ответ

6

Любое решение должно быть на базе одного модуля (так как решение по которому реализация использования производится сам родительский модуль, а не какой-то механизм в Perl). В случае, когда вы указали, проверяя значение $ Date :: Simple :: NoXs после того, как оператор использования скажет вам, используется ли XS или нет.

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

Например, чтобы обнаружить, если Скалярные :: Util использует XS или чистые версии Perl, вы должны проверить существование функции dualvar.

use Scalar::Util; 
die "not using XS for Scalar::Util\n" unless if @Scalar::Util::EXPORTFAIL; 
+0

Ну, вот как «Скалар :: Утилит» рассказывает о том, что XS не удалось загрузить, но я думаю, вам будет лучше с внешней стороны проверять '@Scalar :: Util :: EXPORT_FAIL', что« Scalar :: Util 'явно пытается настроить для вас. –

+0

Возможно, лучше было бы «предупредить», а не «умереть», поскольку версия pure-Perl должна работать; это просто медленнее. – cjm

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_name и engine_override. Но, опять же, сейчас нет ничего, что даже семена объединяют API для достижения этого.

+0

+1 для * :: XS * :: PP info .. не решает мою проблему atm. хоть –

1

Существует общий способ обнаружить, что ваша функция - это XSUB CV. Просто проверьте, возвращает ли XSUB-слот CV не указатель NULL или нет.

например. check for My :: func

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

 Смежные вопросы

  • Нет связанных вопросов^_^