Domanda
Voglio sapere qual è esattamente la sequenza di chiamate che si verifica quando viene chiamato un getter/setter creato tramite Class::MethodMaker?
Quanto sono più costosi i getter/setter definiti da MethodMaker rispetto a quelli nativi (sovrascritti nel modulo)?
Soluzione
Non ho una risposta semplice alla tua domanda riguardante le prestazioni di Class::MethodMaker.Come menzionato in una risposta precedente, puoi utilizzare il debugger per scoprire cosa sta succedendo sotto il cofano.Tuttavia, so che Class::MethodMaker genera Enorme quantità di codice al momento dell'installazione.Ciò indicherebbe tre cose separate per me:
- Per quanto riguarda il tempo di esecuzione, lo è probabilmente sul lato più veloce dell'intera serie di generatori di metodi.Perché altrimenti generare un sacco di codice al momento dell'installazione?
- Installa O (Megabyte) di codice sul tuo disco!
- Potrebbe essere potenzialmente lento in fase di compilazione, a seconda di quali parti del codice generato vengono caricate per casi d'uso semplici.
Hai davvero bisogno di dedicare qualche minuto a pensare a ciò di cui hai veramente bisogno.Se desideri che i metodi di accesso semplici vengano generati automaticamente ma scrivi qualcosa di più complicato a mano, magari guarda Class::Accessor::Fast.Oppure, se desideri i metodi di accesso più veloci possibili, esamina Class::XSAccessor, i cui metodi estremamente semplici vengono eseguiti come codice C/XS e sono circa due volte più veloci dell'accessor Perl più veloce.(Nota:Ho scritto l'ultimo modulo, quindi prendilo con le pinze.)
Un ulteriore commento:se utilizzerai il toolkit PAR/PAR::Packer per creare il pacchetto della tua applicazione, tieni presente che la grande quantità di codice di Class::MethodMaker si traduce in un eseguibile significativamente più grande e in un tempo di avvio iniziale più lento.Inoltre, esiste un'incompatibilità nota tra C::MethodMaker e PAR.Ma questo può essere considerato un bug PAR.
Altri suggerimenti
Questo è esattamente a cosa servono gli strumenti di debug :)
Dai un'occhiata a perldebug documenti, in particolare la sezione sulla profilazione.
In particolare, eseguendo lo script con perl -dDProf filename.pl genererà un file tt.out da cui lo strumento dprofpp (distribuito con Perl) può produrre un report.
Ho utilizzato il seguente semplice script di test:
#!/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";
Eseguendolo con perl -d:DProf Methodmakertest.pl e quindi utilizzando dprofpp sull'output si ottiene:
[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
Le due chiamate più costose sono i blocchi Class::MethodMaker::Constants::BEGIN e Class::MethodMaker::Engine::BEGIN, che ovviamente vengono chiamati solo in fase di compilazione, quindi potrebbero rallentare leggermente la compilazione dello script, ma la successiva creazione di oggetti/utilizzo degli accessori non ne viene influenzata.
La vera domanda è:importa?
È ancora un altro modulo che genera accessori.Tutti questi moduli hanno un compromesso velocità/funzionalità.Scegline uno che offra tutto ciò di cui hai bisogno.Non è che gli accessori possano diventare un collo di bottiglia nella tua applicazione.
@Leon Timmermans
Sono consapevole del fatto che esiste un compromesso tra velocità e funzionalità, ma voglio avere un'idea di quanto sia buono/cattivo?E molto meglio, se riesco a ottenere informazioni specifiche sulle implementazioni in modo che sia più facile decidere.
In seguito alla mia risposta precedente, se vuoi vedere esattamente cosa succede dietro le quinte in dettaglio, esegui il tuo script nel debugger con la modalità di traccia attiva (perl -d nomefile.pl, quindi dì "t" per tracciare, quindi "r " per eseguire lo script;aspettatevi comunque un sacco di risultati!).