Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Взгляните на перлдебуг документы, особенно раздел, посвященный профилированию.

В частности, запуск вашего скрипта с 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 на выходе, выдал:

[davidp@supernova:~/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, которые, очевидно, вызываются только во время компиляции, поэтому они могут немного замедлить компиляцию вашего скрипта, но на последующее создание объекта / использование средств доступа это не влияет.

Настоящий вопрос заключается в следующем:имеет ли это значение?

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

@Леон Тиммерманс

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top