Вопрос
Я хочу знать, какова именно последовательность вызовов, которая возникает при вызове средства получения / установки, созданного с помощью Class::MethodMaker?
Насколько дороже геттеры / установщики, определенные MethodMaker, чем собственные (перезаписанные в модуле)?
Решение
У меня нет простого ответа на ваш вопрос относительно производительности Class::MethodMaker.Как упоминалось в предыдущем ответе, вы можете использовать отладчик, чтобы узнать, что происходит под капотом.Однако я знаю, что Class::MethodMaker генерирует Огромный объем кода во время установки.Для меня это указывало бы на три отдельные вещи:
- Что касается времени выполнения, то это вероятно на более быстрой стороне всего множества генераторов методов.Иначе зачем генерировать кучу кода во время установки?
- Он устанавливает O (мегабайт) кода на ваш диск!
- Потенциально это может быть медленно во время компиляции, в зависимости от того, какие части сгенерированного кода загружаются для простых вариантов использования.
Вам действительно нужно потратить несколько минут, чтобы подумать о том, что вам действительно нужно.Если вы хотите, чтобы простые методы доступа генерировались автоматически, но написали что-нибудь более сложное вручную, возможно, посмотрите на 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" для запуска скрипта.;однако ожидайте большого результата!).