15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/perl
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# XXX
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub table() {
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my ($name) = @_;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	print <<'EOF';
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<table border=0>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<tr><th>System</th><th>PCRE</th><th>RE2</th></tr>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	foreach my $sys (@sys) {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		my $ns_pcre = $data{$sys}->{sprintf($name, "PCRE")}->{'ns/op'};
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		my $ns_re2 = $data{$sys}->{sprintf($name, "RE2")}->{'ns/op'};
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf "<tr><td>%s</td><td>%.1f µs</td><td>%.1f µs</td></tr>\n", $sysname{$sys}, $ns_pcre/1000., $ns_re2/1000.;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	print <<'EOF';
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<tr height=5><td colspan=3></td></tr>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</table>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@sizes = (
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"8", "16", "32", "64", "128", "256", "512",
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K",
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"1M", "2M", "4M", "8M", "16M"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%color = (
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"PCRE" => "0.7 0 0",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"RE2" => "0 0 1",
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$ngraph = 0;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub graph() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my ($name) = @_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my $sys = "wreck";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my $base = sprintf("regexp3g%d", ++$ngraph);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	open(JGR, ">$base.jgr") || die "open >$base.jgr: $!";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "bbox -20 -12 392 95\n";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "newgraph clip x_translate 0.25 y_translate 0.25\n";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	$ymax = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	%lastx = ();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	%lasty = ();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	foreach my $who ("PCRE", "RE2") {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf JGR "newcurve pts\n";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for(my $i=0; $i<@sizes; $i++) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			my $key = sprintf("%s%s/%s", $name, $who, $sizes[$i]);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			my $val = $data{$sys}->{$key}->{'MB/s'};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			next if !defined($val);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if($val > $ymax) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				$ymax = $val;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$lastx{$who} = $i;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$lasty{$who} = $val;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf JGR "$i %f (* %s *)\n", $val, $key;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		my $color = $color{$who};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf JGR "marktype none color $color linethickness 2 linetype solid label : $who\n";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my $n = @sizes;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "xaxis min -1 max $n size 5 label : text size (bytes)\n";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "  no_auto_hash_marks hash_labels fontsize 9\n";
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for($i=0; $i<@sizes; $i+=3) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf JGR "  hash_at $i hash_label at $i : $sizes[$i]\n";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my $y = 1;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while(10*$y <= $ymax) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$y = 10*$y;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for($i=2; $i<=10; $i++) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if($i*$y > $ymax) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$y = $i*$y;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	foreach my $who ("PCRE", "RE2") {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$x1 = $lastx{$who};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$y1 = $lasty{$who};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$x1 *= 1.01;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		my $v = "vjc";
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if($y1 < 0.05 * $y) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$v = "vjb";
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$y1 = 0.05 * $y;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf JGR "newstring x $x1 y $y1 hjl $v : $who\n";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "yaxis min 0 max $y size 1 label : speed (MB/s)\n";
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf JGR "  hash_labels fontsize 9\n";
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	# printf JGR "legend defaults font Times-Roman fontsize 10 x 0 y $y hjl vjt\n";
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	system("jgraph $base.jgr >$base.eps"); # die "system: $!";
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	system("gs -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dEPSCrop -sDEVICE=png16m -r100 -sOutputFile=$base.png -dBATCH -dQUIT -dQUIET -dNOPAUSE $base.eps");
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf "<img src=$base.png>\n"
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sub skip() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while(<>) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if(/^<!-- -->/) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			print;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@sys = ("r70", "c2", "wreck", "mini");
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%sysname = (
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"r70" => "AMD Opteron 8214 HE, 2.2 GHz",
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"c2" => "Intel Core2 Duo E7200, 2.53 GHz",
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"wreck" => "Intel Xeon 5150, 2.66 GHz (Mac Pro)",
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"mini" => "Intel Core2 T5600, 1.83 GHz (Mac Mini)",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%func = (
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"table" => \&table,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	"graph" => \&graph,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)foreach my $sys (@sys) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	open(F, "benchlog.$sys") || die "open benchlog.$sys: $!";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	my %sysdat;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while(<F>) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if(/^([A-Za-z0-9_\/]+)\s+(\d+)\s+(\d+) ns\/op/) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			my %row;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$row{"name"} = $1;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$row{"iter"} = $2;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$row{"ns/op"} = $3;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if(/([\d.]+) MB\/s/){
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				$row{"MB/s"} = $1;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			$sysdat{$row{"name"}} = \%row;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	close F;	
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	$data{$sys} = \%sysdat;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)while(<>) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	print;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(/^<!-- benchlog (\w+) -->/) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$func{$1}();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		skip();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		next;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(/^<!-- benchlog (\w+) ([%\w]+) -->/) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		$func{$1}($2);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		skip();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		next;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156