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