1#!/usr/bin/perl 2# XXX 3 4sub table() { 5 my ($name) = @_; 6 print <<'EOF'; 7<table border=0> 8<tr><th>System</th><th>PCRE</th><th>RE2</th></tr> 9EOF 10 foreach my $sys (@sys) { 11 my $ns_pcre = $data{$sys}->{sprintf($name, "PCRE")}->{'ns/op'}; 12 my $ns_re2 = $data{$sys}->{sprintf($name, "RE2")}->{'ns/op'}; 13 printf "<tr><td>%s</td><td>%.1f µs</td><td>%.1f µs</td></tr>\n", $sysname{$sys}, $ns_pcre/1000., $ns_re2/1000.; 14 } 15 print <<'EOF'; 16<tr height=5><td colspan=3></td></tr> 17</table> 18EOF 19} 20 21@sizes = ( 22 "8", "16", "32", "64", "128", "256", "512", 23 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", 24 "1M", "2M", "4M", "8M", "16M" 25); 26 27%color = ( 28 "PCRE" => "0.7 0 0", 29 "RE2" => "0 0 1", 30); 31 32$ngraph = 0; 33 34sub graph() { 35 my ($name) = @_; 36 37 my $sys = "wreck"; 38 my $base = sprintf("regexp3g%d", ++$ngraph); 39 40 open(JGR, ">$base.jgr") || die "open >$base.jgr: $!"; 41 printf JGR "bbox -20 -12 392 95\n"; 42 printf JGR "newgraph clip x_translate 0.25 y_translate 0.25\n"; 43 $ymax = 0; 44 %lastx = (); 45 %lasty = (); 46 foreach my $who ("PCRE", "RE2") { 47 printf JGR "newcurve pts\n"; 48 for(my $i=0; $i<@sizes; $i++) { 49 my $key = sprintf("%s%s/%s", $name, $who, $sizes[$i]); 50 my $val = $data{$sys}->{$key}->{'MB/s'}; 51 next if !defined($val); 52 if($val > $ymax) { 53 $ymax = $val; 54 } 55 $lastx{$who} = $i; 56 $lasty{$who} = $val; 57 printf JGR "$i %f (* %s *)\n", $val, $key; 58 } 59 my $color = $color{$who}; 60 printf JGR "marktype none color $color linethickness 2 linetype solid label : $who\n"; 61 } 62 my $n = @sizes; 63 printf JGR "xaxis min -1 max $n size 5 label : text size (bytes)\n"; 64 printf JGR " no_auto_hash_marks hash_labels fontsize 9\n"; 65 for($i=0; $i<@sizes; $i+=3) { 66 printf JGR " hash_at $i hash_label at $i : $sizes[$i]\n"; 67 } 68 my $y = 1; 69 while(10*$y <= $ymax) { 70 $y = 10*$y; 71 } 72 for($i=2; $i<=10; $i++) { 73 if($i*$y > $ymax) { 74 $y = $i*$y; 75 last; 76 } 77 } 78 foreach my $who ("PCRE", "RE2") { 79 $x1 = $lastx{$who}; 80 $y1 = $lasty{$who}; 81 $x1 *= 1.01; 82 my $v = "vjc"; 83 if($y1 < 0.05 * $y) { 84 $v = "vjb"; 85 $y1 = 0.05 * $y; 86 } 87 printf JGR "newstring x $x1 y $y1 hjl $v : $who\n"; 88 } 89 printf JGR "yaxis min 0 max $y size 1 label : speed (MB/s)\n"; 90 printf JGR " hash_labels fontsize 9\n"; 91 # printf JGR "legend defaults font Times-Roman fontsize 10 x 0 y $y hjl vjt\n"; 92 93 system("jgraph $base.jgr >$base.eps"); # die "system: $!"; 94 system("gs -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dEPSCrop -sDEVICE=png16m -r100 -sOutputFile=$base.png -dBATCH -dQUIT -dQUIET -dNOPAUSE $base.eps"); 95 96 printf "<img src=$base.png>\n" 97 98} 99 100sub skip() { 101 while(<>) { 102 if(/^<!-- -->/) { 103 print; 104 last; 105 } 106 } 107} 108 109@sys = ("r70", "c2", "wreck", "mini"); 110%sysname = ( 111 "r70" => "AMD Opteron 8214 HE, 2.2 GHz", 112 "c2" => "Intel Core2 Duo E7200, 2.53 GHz", 113 "wreck" => "Intel Xeon 5150, 2.66 GHz (Mac Pro)", 114 "mini" => "Intel Core2 T5600, 1.83 GHz (Mac Mini)", 115); 116 117%func = ( 118 "table" => \&table, 119 "graph" => \&graph, 120 121); 122 123foreach my $sys (@sys) { 124 open(F, "benchlog.$sys") || die "open benchlog.$sys: $!"; 125 my %sysdat; 126 while(<F>) { 127 if(/^([A-Za-z0-9_\/]+)\s+(\d+)\s+(\d+) ns\/op/) { 128 my %row; 129 $row{"name"} = $1; 130 $row{"iter"} = $2; 131 $row{"ns/op"} = $3; 132 if(/([\d.]+) MB\/s/){ 133 $row{"MB/s"} = $1; 134 } 135 $sysdat{$row{"name"}} = \%row; 136 } 137 } 138 close F; 139 $data{$sys} = \%sysdat; 140} 141 142while(<>) { 143 print; 144 if(/^<!-- benchlog (\w+) -->/) { 145 $func{$1}(); 146 skip(); 147 next; 148 } 149 if(/^<!-- benchlog (\w+) ([%\w]+) -->/) { 150 $func{$1}($2); 151 skip(); 152 next; 153 } 154} 155 156