2008-09-15 5 views
2

Я хочу знать, что именно представляет собой последовательность вызовов, которая возникает, когда вызывается геттер/сеттер, созданный с помощью класса :: MethodMaker?Что делает класс :: MethodMaker?

Насколько дороже геттер/сеттеры, определенные MethodMaker, чем нативные (перезаписываемые в модуле)?

ответ

2

У меня нет простого ответа на ваш вопрос относительно Class :: MethodMaker. Как упоминалось в предыдущем ответе, вы можете использовать отладчик, чтобы узнать, что происходит под капотом. Тем не менее, я знаю, что Class :: MethodMaker генерирует огромные количества кода во время установки. Это указывает на три отдельные вещи для меня:

  1. Что касается времени выполнения, это вероятно на более быстрой стороне Уйма генераторов методом. Зачем генерировать нагрузку кода во время установки в противном случае?
  2. Он устанавливает O (мегабайты) кода на вашем диске!
  3. Возможно, он будет медленным во время компиляции, в зависимости от того, какие части сгенерированного кода загружаются для простых случаев использования.

Вам действительно нужно потратить несколько минут, чтобы подумать о том, что вам действительно нужно.Если вы хотите, чтобы простые методы доступа были автоматически сгенерированы, но пишите что-нибудь более сложное вручную, возможно, посмотрите на Class :: Accessor :: Fast. Или, если вам нужны самые быстрые методы доступа, исследуйте Class :: XSAccessor, чьи сверхпростые методы выполняются как код C/XS и примерно в два раза быстрее, чем самый быстрый Perl-аксессор. (Примечание: я написал последний модуль, поэтому возьмите это с солью.)

Еще один комментарий: если вы когда-либо собираетесь использовать набор инструментов PAR/PAR :: Packer для упаковки вашего приложения, обратите внимание, что большой объем кода класса :: MethodMaker приводит к значительно большему исполнению и более медленному начальному времени запуска. Кроме того, существует известная несовместимость между C :: MethodMaker и PAR. Но это может считаться ошибкой PAR.

0

Реальный вопрос: имеет ли это значение?

Это еще один модуль для создания модулей доступа. Все эти модули имеют компромисс скорости/функциональности. Просто выберите тот, который предлагает все, что вам нужно. Это не похоже на то, что аксессоры, скорее всего, станут узким местом в вашем приложении.

0

@Leon Timmermans

Я отдаю себе отчет в том, что есть некоторая скорость/функциональность компромисс, но хочу, чтобы получить представление о том, насколько хорошо/плохо? И намного лучше, если я смогу получить конкретные реализации, чтобы их было легче решить.

1

Это именно то, что отладочные инструменты для :)

Посмотрите на perldebug документы, в частности, в разделе профилирования.

В частности, запуск сценария с помощью perl -dDProf filename.pl приведет к созданию файла tt.out, который инструмент dprofpp (распространяемый с Perl) может подготовить отчет.

Я использовал следующий простой тестовый скрипт:

 
#!/usr/bin/perl 

package Foo; 
use strict; 
use Class::MethodMaker [ scalar => ['bar'], new => ['new'] ]; 

package main; 
use strict; 

my $foo = new Foo; 
$foo->bar('baz'); 
print $foo->bar . "\n"; 

Запуск его с Perl -d: DProf methodmakertest.pl, а затем с помощью dprofpp на выходе дало:

 
[[email protected]:~/tmp]$ dprofpp tmon.out 
Class::MethodMaker::scalar::scal0000 has 1 unstacked calls in outer 
Class::MethodMaker::Engine::new has 1 unstacked calls in outer 
AutoLoader::AUTOLOAD has -2 unstacked calls in outer 
Total Elapsed Time = 0.08894 Seconds 
    User+System Time = 0.07894 Seconds 
Exclusive Times 
%Time ExclSec CumulS #Calls sec/call Csec/c Name 
25.3 0.020 0.020  4 0.0050 0.0050 Class::MethodMaker::Constants::BEG 
              IN 
25.3 0.020 0.029  12 0.0017 0.0025 Class::MethodMaker::Engine::BEGIN 
12.6 0.010 0.010  1 0.0100 0.0100 DynaLoader::dl_load_file 
12.6 0.010 0.010  2 0.0050 0.0050 AutoLoader::AUTOLOAD 
12.6 0.010 0.010  14 0.0007 0.0007 Class::MethodMaker::V1Compat::reph 
              rase_prefix_option 
0.00 0.000 0.000  1 0.0000 0.0000 Class::MethodMaker::scalar::scal00 
              00 
0.00 0.000 0.000  1 0.0000 0.0000 Class::MethodMaker::Engine::new 
0.00  - -0.000  1  -  - DynaLoader::dl_undef_symbols 
0.00  - -0.000  1  -  - Class::MethodMaker::bootstrap 
0.00  - -0.000  1  -  - warnings::BEGIN 
0.00  - -0.000  1  -  - warnings::unimport 
0.00  - -0.000  1  -  - DynaLoader::dl_find_symbol 
0.00  - -0.000  1  -  - DynaLoader::dl_install_xsub 
0.00  - -0.000  1  -  - UNIVERSAL::VERSION 
0.00  - -0.000  1  -  - Foo::new 

Две самые дорогие вызовы - это классы Class :: MethodMaker :: Constants :: BEGIN и Class :: MethodMaker :: Engine :: BEGIN, которые явно вызывают только во время компиляции, поэтому они могут немного замедлить компиляцию вашего скрипта, но последующее создание объекта/accessor не влияет на это.

0

В дополнение к моему предыдущему ответу, если вы хотите подробно узнать, что происходит под капотом, запустите свой сценарий в отладчике с режимом трассировки (perl -d filename.pl, а затем скажите «t» для отслеживания , затем «r» для запуска скрипта, ожидайте много результатов, хотя!).

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