12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#!/usr/bin/perl
22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson# XXX
32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsub table() {
52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my ($name) = @_;
62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	print <<'EOF';
72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson<table border=0>
82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson<tr><th>System</th><th>PCRE</th><th>RE2</th></tr>
92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonEOF
102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	foreach my $sys (@sys) {
112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		my $ns_pcre = $data{$sys}->{sprintf($name, "PCRE")}->{'ns/op'};
122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		my $ns_re2 = $data{$sys}->{sprintf($name, "RE2")}->{'ns/op'};
132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		printf "<tr><td>%s</td><td>%.1f µs</td><td>%.1f µs</td></tr>\n", $sysname{$sys}, $ns_pcre/1000., $ns_re2/1000.;
142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	print <<'EOF';
162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson<tr height=5><td colspan=3></td></tr>
172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson</table>
182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonEOF
192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson@sizes = (
222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"8", "16", "32", "64", "128", "256", "512",
232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K",
242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"1M", "2M", "4M", "8M", "16M"
252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson);
262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson%color = (
282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"PCRE" => "0.7 0 0",
292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"RE2" => "0 0 1",
302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson);
312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson$ngraph = 0;
332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsub graph() {
352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my ($name) = @_;
362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	
372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my $sys = "wreck";
382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my $base = sprintf("regexp3g%d", ++$ngraph);
392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	open(JGR, ">$base.jgr") || die "open >$base.jgr: $!";
412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "bbox -20 -12 392 95\n";
422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "newgraph clip x_translate 0.25 y_translate 0.25\n";
432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	$ymax = 0;
442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	%lastx = ();
452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	%lasty = ();
462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	foreach my $who ("PCRE", "RE2") {
472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		printf JGR "newcurve pts\n";
482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		for(my $i=0; $i<@sizes; $i++) {
492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			my $key = sprintf("%s%s/%s", $name, $who, $sizes[$i]);
502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			my $val = $data{$sys}->{$key}->{'MB/s'};
512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			next if !defined($val);
522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			if($val > $ymax) {
532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson				$ymax = $val;
542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			}
552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$lastx{$who} = $i;
562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$lasty{$who} = $val;
572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			printf JGR "$i %f (* %s *)\n", $val, $key;
582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		}
592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		my $color = $color{$who};
602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		printf JGR "marktype none color $color linethickness 2 linetype solid label : $who\n";
612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my $n = @sizes;
632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "xaxis min -1 max $n size 5 label : text size (bytes)\n";
642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "  no_auto_hash_marks hash_labels fontsize 9\n";
652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	for($i=0; $i<@sizes; $i+=3) {
662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		printf JGR "  hash_at $i hash_label at $i : $sizes[$i]\n";
672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my $y = 1;
692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	while(10*$y <= $ymax) {
702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$y = 10*$y;
712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	for($i=2; $i<=10; $i++) {
732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		if($i*$y > $ymax) {
742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$y = $i*$y;
752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			last;
762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		}
772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	foreach my $who ("PCRE", "RE2") {
792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$x1 = $lastx{$who};
802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$y1 = $lasty{$who};
812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$x1 *= 1.01;
822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		my $v = "vjc";
832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		if($y1 < 0.05 * $y) {
842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$v = "vjb";
852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$y1 = 0.05 * $y;
862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		}
872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		printf JGR "newstring x $x1 y $y1 hjl $v : $who\n";
882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "yaxis min 0 max $y size 1 label : speed (MB/s)\n";
902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf JGR "  hash_labels fontsize 9\n";
912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	# printf JGR "legend defaults font Times-Roman fontsize 10 x 0 y $y hjl vjt\n";
922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	system("jgraph $base.jgr >$base.eps"); # die "system: $!";
942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	system("gs -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dEPSCrop -sDEVICE=png16m -r100 -sOutputFile=$base.png -dBATCH -dQUIT -dQUIET -dNOPAUSE $base.eps");
952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	
962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	printf "<img src=$base.png>\n"
972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	
982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsub skip() {
1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	while(<>) {
1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		if(/^<!-- -->/) {
1032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			print;
1042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			last;
1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		}
1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson@sys = ("r70", "c2", "wreck", "mini");
1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson%sysname = (
1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"r70" => "AMD Opteron 8214 HE, 2.2 GHz",
1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"c2" => "Intel Core2 Duo E7200, 2.53 GHz",
1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"wreck" => "Intel Xeon 5150, 2.66 GHz (Mac Pro)",
1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"mini" => "Intel Core2 T5600, 1.83 GHz (Mac Mini)",
1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson);
1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson%func = (
1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"table" => \&table,
1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	"graph" => \&graph,
1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	
1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson);
1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonforeach my $sys (@sys) {
1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	open(F, "benchlog.$sys") || die "open benchlog.$sys: $!";
1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	my %sysdat;
1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	while(<F>) {
1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		if(/^([A-Za-z0-9_\/]+)\s+(\d+)\s+(\d+) ns\/op/) {
1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			my %row;
1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$row{"name"} = $1;
1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$row{"iter"} = $2;
1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$row{"ns/op"} = $3;
1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			if(/([\d.]+) MB\/s/){
1332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson				$row{"MB/s"} = $1;
1342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			}
1352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson			$sysdat{$row{"name"}} = \%row;
1362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		}
1372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
1382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	close F;	
1392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	$data{$sys} = \%sysdat;
1402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonwhile(<>) {
1432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	print;
1442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	if(/^<!-- benchlog (\w+) -->/) {
1452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$func{$1}();
1462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		skip();
1472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		next;
1482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
1492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	if(/^<!-- benchlog (\w+) ([%\w]+) -->/) {
1502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		$func{$1}($2);
1512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		skip();
1522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson		next;
1532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	}
1542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
156