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