Some Perl Benchmark Results

A beginning programmer only cares about making the program work. Given sufficient time, an experienced programmer cares about some other factors: performance, security, future scalability and maintainability... I don't claim to be very experienced but happened to have time to do benchmarking on some language constructs in Perl, my favorite language, thanks to an understanding boss at Shell. I didn't use the module Benchmark.pm specifically designed for benchmarking. But my results should be useful to some extent. All tests were run on my SPARCStation-20 running Solaris2.5.1 with Perl5.004 unless otherwise stated. Each script was run about 5 times and the time it took was averaged.

--------------------------------------------------------------------------------

#!.../perl5.004 -w
$start=(times)[0];
$tmp="1234.56789";
for ($i=0; $i<100000; $i++)
 { $temp=int $tmp;				#1.81 seconds	Best
  #$temp=substr $tmp,0,(index $tmp,"\.");	#2.37 sec	Second Best
  #$temp=sprintf "%d",$tmp;			#3.18 sec	Poor
  #$temp=(split /\./,$tmp)[0];			#7.42 sec	Worst
 }
print $temp;
$end=(times)[0];
printf "\nThis script takes %.2f CPU seconds.\n", $end-$start;

--------------------------------------------------------------------------------

system "ls > /dev/null";	#about the same fast as the next line
exec "ls > /dev/null";		#on one directory I tested (ca. 13 sec for 50 cycles)

--------------------------------------------------------------------------------

if (/a/)			#slower than the next line
if ($_ eq "abcd")

--------------------------------------------------------------------------------

for ($i=0; $i<2000; $i++)
 { open TMP, "myfile";
   while ()
    { if (!/no rows selected/)			#0.47 sec
      #chomp; if ($_ ne "no rows selected")	#0.43 sec, about the same fast
       { print "OK\n";
       }
    }
   close TMP;
 }

--------------------------------------------------------------------------------

$tmp="b";
for ($i=0; $i<100000; $i++)
 { if ($tmp=~/[abc]/)		#2.07 sec, just to confirm what Jeffrey Friedl
 					#says, "character class is very fast"
  #if ($tmp=~/(a|b|c)/)		#2.57 sec
  #if ($tmp=~/(?:a|b|c)/)	#2.14 sec
  #if ($tmp=~/(?=a|b|c)/)	#2.23 sec
  #if ($tmp=~/(?!a|b|c)/)	#2.73 sec
   {#code snipped
   }
 }

--------------------------------------------------------------------------------

$a="a";
$b="b";
for ($i=0; $i<1000000; $i++)
 { if ($a eq $b) {}     #2.00 sec on WindowsNT runnign ActivePerl5.005_03
  #if ($a ne $b) {}     #2.09 sec
 }

--------------------------------------------------------------------------------

To my Computer Page