Что именно делает Class :: MethodMaker? - PullRequest
2 голосов
/ 15 сентября 2008

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

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

Ответы [ 5 ]

2 голосов
/ 16 сентября 2008

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

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

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

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

1 голос
/ 15 сентября 2008

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

Ознакомьтесь с документами 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 для вывода дало:

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

0 голосов
/ 15 сентября 2008

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

0 голосов
/ 15 сентября 2008

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

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

0 голосов
/ 15 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...