Frage : Perl-Index zu, der lang dauert

Ich habe einen Index, der viel Sortieren gegründet nach einem „einfachen gleitenden Mittel“ tut, das der Reihe nach nach 100 von Reihen basiert. Das Programm wendet Mathe viel Zeit durchführen auf. Ich muss es beschleunigen. Ist hier der Code:
------------------
package MAIN;
use streng;

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 mein $i (@price_array) {
Druck „ich: $i \ n“;
}
my $sma = 0;
for (mein $count = 100000; $count >= 1; $count--) {# Knalle von 4 Werte „$length_ma "
$sma = simple_moving_avg (\ @price_array, $length_of_sma);
/>print „einfaches bewegliches avg: $sma \ n“;
exit;

sub simple_moving_avg {mein
$pointer_array = $_ [0]; mein
$length_ma = $_ [1]; mein
$sum = 0;
mein @tmp = @$pointer_array;

für (mein $count = $length_ma; $count >= 1; $count--) {mein
$value = Knall (@tmp);
wenn (definiertes $value) {
$sum = $value + $sum; mein
}
}
$ma = sprintf („%.2f“, ($sum/$length_ma));
Rückhol$ma;
}
--------------------------
Here ist das Resultat vom Betrieb von DProf:

Total Gesamtverarbeitungszeit = 1.987965 Seconds
User+System Zeit = 2.194965 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sek/Anruf Csec/c Name
108. 2.377 2.377 100000 0.0000 0.0000 MAIN:: simple_moving_avg
0.00 - -0.000 1 - - streng:: import
0.00 - -0.000 1 - - Hauptleitung:: BEGIN
0.00 - -0.000 1 - - streng:: bits
0.00 - -0.000 1 - - MAIN:: BEGIN
--------
My Frage ist: Kann diese Perl-Subroutine auf verbessert werden (das ExclSec muss durch 50% geschnitten werden mindestens)? Ich bin nicht imstande, die Reihe zu ändern, die in das Unterseeboot überschritten wird. Wenn der Code nicht erheblich auf verbessert werden kann würde es sein schneller, Programm Wechselstrom-++ (mich erlerne C++) oder Versammlungsteilnehmer zu benennen? Was würde dieser Code sein? Viele thanks.

Antwort : Perl-Index zu, der lang dauert

Vorsimple_moving_avg {
    mein ($pointer_array, $length_ma) =@_;
    mein $sum = 0;
    $sum += $ _ für @ {$pointer_array} [0. $length_ma-1];
    Rückholsprintf " %.2f ", $sum/$length_ma;
}
Weitere Lösungen  
 
programming4us programming4us