Pregunta

Quiero saber cuál es exactamente la secuencia de llamadas que se produce cuando se llama a un captador/definidor creado a través de Class::MethodMaker.

¿Cuánto más costosos son los captadores/definidores definidos por MethodMaker que los nativos (sobrescritos en el módulo)?

¿Fue útil?

Solución

No tengo una respuesta sencilla para su pregunta sobre el rendimiento de Class::MethodMaker.Como se mencionó en una respuesta anterior, puede usar el depurador para descubrir qué sucede debajo del capó.Sin embargo, sé que Class::MethodMaker genera enorme cantidades de código en el momento de la instalación.Esto me indicaría tres cosas distintas:

  1. En cuanto al tiempo de ejecución, es probablemente en el lado más rápido de toda la gran cantidad de generadores de métodos.¿Por qué generar una gran cantidad de código en el momento de la instalación?
  2. ¡Instala O (Megabytes) de código en tu disco!
  3. Es posible que sea lento en el momento de la compilación, dependiendo de qué partes del código generado se carguen para casos de uso simples.

Realmente necesitas dedicar unos minutos a pensar en lo que realmente necesitas.Si desea que los métodos de acceso simples se generen automáticamente pero escriba algo más complicado a mano, tal vez mire Class::Accessor::Fast.O, si desea los métodos de acceso más rápidos posibles, investigue Class::XSAccessor, cuyos métodos extra simples se ejecutan como código C/XS y son aproximadamente dos veces más rápidos que el acceso de Perl más rápido.(Nota:Escribí el último módulo, así que tómalo con cautela).

Un comentario más:Si alguna vez va a utilizar el kit de herramientas PAR/PAR::Packer para empaquetar su aplicación, tenga en cuenta que la gran cantidad de código de Class::MethodMaker da como resultado un ejecutable significativamente más grande y un tiempo de inicio inicial más lento.Además, existe una incompatibilidad conocida entre C::MethodMaker y PAR.Pero eso puede considerarse un error PAR.

Otros consejos

Esto es exactamente para lo que sirven las herramientas de depuración :)

Echa un vistazo a perldebug docs, particularmente la sección sobre elaboración de perfiles.

En particular, ejecutar su script con perl -dDProf filename.pl generará un archivo tt.out desde el cual la herramienta dprofpp (distribuida con Perl) puede generar un informe.

Utilicé el siguiente script de prueba simple:

#!/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";

Al ejecutarlo con perl -d:DProf Methodmakertest.pl y luego usar dprofpp en la salida, se obtuvo:

[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

Las dos llamadas más caras son los bloques Class::MethodMaker::Constants::BEGIN y Class::MethodMaker::Engine::BEGIN, que obviamente se llaman solo en tiempo de compilación, por lo que pueden ralentizar ligeramente la compilación de su script. pero la creación posterior de objetos/el uso del descriptor de acceso no se ve afectado.

La verdadera pregunta es:¿importa?

Es otro módulo generador de accesos.Todos estos módulos tienen una compensación de velocidad/funcionalidad.Simplemente elija uno que ofrezca todo lo que necesita.No es que los accesores vayan a convertirse en un cuello de botella en su aplicación.

@Leon Timmermans

Soy consciente del hecho de que existe cierta compensación entre velocidad y funcionalidad, pero quiero tener una idea de qué tan bueno o malo es.Y mucho mejor, si puedo especificar las implementaciones para que sea más fácil decidir.

Además de mi respuesta anterior, si desea ver exactamente lo que sucede bajo el capó en detalle, ejecute su script en el depurador con el modo de rastreo activado (perl -d filename.pl, luego diga "t" para rastrear, luego "r "para ejecutar el script;¡Espera mucho resultado!).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top