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)?

È stato utile?

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:

  1. 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?
  2. Installa O (Megabyte) di codice sul tuo disco!
  3. 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!).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top