Microsoft
Software
Hardware
Network
Question : Perl script taking too long
I have a script that does a lot of sorting based upon a 'simple moving average' which in turn is based upon 100's of arrays. The program is spending a lot of time performing the math. I must speed it up. Here is the code:
------------------
package MAIN;
use strict;
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 my $i (@price_array) {
print "i: $i\n";
}
my $sma = 0;
for (my $count = 100000; $count >= 1; $count--) { # pops of 4 values "$length_ma"
$sma = simple_moving_avg(\@price_
array,$len
gth_of_sma
);
}
print "Simple moving avg: $sma\n";
exit;
sub simple_moving_avg {
my $pointer_array = $_[0];
my $length_ma = $_[1];
my $sum = 0;
my @tmp = @$pointer_array;
for (my $count = $length_ma; $count >= 1; $count--) {
my $value = pop (@tmp);
if (defined $value) {
$sum = $value + $sum;
}
}
my $ma = sprintf("%.2f",($sum / $length_ma));
return $ma;
}
--------------------------
Here is the result from running DProf:
Total Elapsed Time = 1.987965 Seconds
User+System Time = 2.194965 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
108. 2.377 2.377 100000 0.0000 0.0000 MAIN::simple_moving_avg
0.00 - -0.000 1 - - strict::import
0.00 - -0.000 1 - - main::BEGIN
0.00 - -0.000 1 - - strict::bits
0.00 - -0.000 1 - - MAIN::BEGIN
--------
My question is: Can this perl subroutine be improved upon (the ExclSec needs to be cut by at least 50%)? I am unable to modify the array being passed into the sub. If the code can not be significantly improved upon would it be faster to call a C++ program (I am learning C++) or assembler? What would that code be? Many thanks.
Answer : Perl script taking too long
sub simple_moving_avg{
my ($pointer_array,$length_ma
)=@_;
my $sum = 0;
$sum += $_ for @{$pointer_array}[0..$leng
th_ma-1];
return sprintf"%.2f",$sum / $length_ma;
}
Random Solutions
open a new window size 300 width 200 height
Using Oracle function MAX with date filelds
Dropdownlist - add value
Are these interview questions too hard for a data-centric .net developer?
Zindus Google and Zimbra contact sync for Thunderbird problem
Modify DHCP scope on cisco pix 501
New Cisco NAT commands in 8.3
How can i implement the same desktop back ground image on all the computers on my domain
ESX 4, Can not add datastore
Excel 2007 records imported into Access 2007 are out of order