Cuestión : Escritura del Perl que dura demasiado

Tengo una escritura que haga mucha clasificación basada sobre una “media móvil simple” que alternadamente se base sobre 100 de órdenes. El programa está pasando mucho tiempo la ejecución de la matemáticas. Debo acelerarlo. Aquí está el código:
------------------CAÑERÍA del
package;
use terminante;

sub simple_moving_avg;

my $length_of_sma = 4;

my @price_array = qw/
11.3
11.25
11.82
11.64
11.19
11.48
11.37
10.84
10.51
10.76
10.8
11.25
11.36
11.34
11.59
11.41
11.18
11.11
11.72
11.57
/;

foreach mi $i (@price_array) {impresión del
“yo: $i \ n”;
my del
} $sma = 0;
for (mi $count = 100000; >= 1 de $count; $count--) {# estallidos 4 del
de los valores “$length_ma " $sma = simple_moving_avg (\ @price_array, $length_of_sma);
/>print “: $sma \ n”;
exit; simple_moving_avg del

sub {
mi $pointer_array = $_ [0];
mi $length_ma = $_ [1];
mi $sum = 0;
mi @tmp = @$pointer_array;
del
para (mi $count = $length_ma; >= 1 de $count; $count--) {
mi $value = estallido (@tmp);
si ($value definido) {
$sum = $value + $sum;
del
del
}} mi $ma = sprintf (“%.2f”, ($sum/$length_ma));
$ma de vuelta;
del
}--------------------------el
Here es el resultado de funcionar DProf: tiempo transcurrido del

Total = 1.987965 tiempo de Seconds
User+System de = sec 2.194965 #Calls de Seconds
Exclusive Times
%Time ExclSec CumulS/llamada Csec/c Name
108. 2.377 2.377 100000 0.0000 0.0000 CAÑERÍAS:: simple_moving_avg
0.00 - -0.000 1 - - terminante:: cañería del import
0.00 - -0.000 1 - -:: BEGIN
0.00 - -0.000 1 - - terminante:: CAÑERÍA del bits
0.00 - -0.000 1 - -:: BEGIN
--------la pregunta del
My es: ¿Puede esta subrutina del Perl ser mejorada sobre (el ExclSec necesita ser cortado por por lo menos el 50%)? No puedo modificar el arsenal que es pasado en el submarino. ¿Si el código no se puede mejorar perceptiblemente sobre él sería más rápido llamar el programa del A.C. ++ (estoy aprendiendo C++) o el ensamblador? ¿Cuáles ese código sería? Muchos thanks.
class= del

Respuesta : Escritura del Perl que dura demasiado

simple_moving_avg secundario {
    mi ($pointer_array, $length_ma) =@_;
    mi $sum = 0;
    _ de $sum += $ para @ {$pointer_array} [0. $length_ma-1];
    sprintf de vuelta " %.2f ", $sum/$length_ma;
}
Otras soluciones  
 
programming4us programming4us