blob: 09b7052b3c3d067c31c87283cb11a984fe8925d4 [file] [log] [blame]
mjs1151ff22007-10-23 22:27:42 +00001#!/usr/bin/perl -w
2
darin46738432007-10-28 23:08:44 +00003# Copyright (C) 2007 Apple Inc. All rights reserved.
mjs1151ff22007-10-23 22:27:42 +00004#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11# notice, this list of conditions and the following disclaimer in the
12# documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26use strict;
mjs69fe8b62007-10-24 00:40:35 +000027use Getopt::Long;
mjs1151ff22007-10-23 22:27:42 +000028use File::Basename;
29
mjs69fe8b62007-10-24 00:40:35 +000030my $showHelp = 0;
31my $jsShellPath;
mjs@apple.comee983742009-12-13 02:18:53 +000032my $suite = "";
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +000033my $ubench = 0;
34my $v8suite = 0;
mjs@apple.comee983742009-12-13 02:18:53 +000035my $parseOnly = 0;
mjs69fe8b62007-10-24 00:40:35 +000036
mjs1151ff22007-10-23 22:27:42 +000037my $programName = basename($0);
38my $usage = <<EOF;
mjs69fe8b62007-10-24 00:40:35 +000039Usage: $programName --shell=[path] [options] FILE FILE
40 --help Show this help message
41 --shell Path to javascript shell
mjs@apple.com184b1162009-12-15 06:24:53 +000042 --suite Select a specific benchmark suite. The default is sunspider-0.9.1
mjs@apple.comee983742009-12-13 02:18:53 +000043 --ubench Use microbenchmark suite instead of regular tests. Same as --suite=ubench
44 --v8-suite Use the V8 benchmark suite. Same as --suite=v8-v4
treat@webkit.orgc47eff92009-06-19 20:57:33 +000045 --parse-only Compare the parse-only benchmark results
mjs1151ff22007-10-23 22:27:42 +000046EOF
47
mjs69fe8b62007-10-24 00:40:35 +000048GetOptions('shell=s' => \$jsShellPath,
mjs@apple.comee983742009-12-13 02:18:53 +000049 'suite=s' => \$suite,
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +000050 'ubench' => \$ubench,
51 'v8-suite' => \$v8suite,
mjs@apple.comee983742009-12-13 02:18:53 +000052 'parse-only' => \$parseOnly,
mjs69fe8b62007-10-24 00:40:35 +000053 'help' => \$showHelp);
54
mjs@apple.comee983742009-12-13 02:18:53 +000055$suite = "ubench" if ($ubench);
56$suite = "v8-v4" if ($v8suite);
57$suite = "parse-only" if ($parseOnly);
mjs@apple.com184b1162009-12-15 06:24:53 +000058$suite = "sunspider-0.9.1" if (!$suite);
mjs@apple.comee983742009-12-13 02:18:53 +000059
60my $resultDirectory = "${suite}-results";
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +000061
darin@apple.com41a7c172007-11-03 00:15:02 +000062if ((scalar @ARGV != 0 && scalar @ARGV != 2) || !$jsShellPath || $showHelp) {
mjs69fe8b62007-10-24 00:40:35 +000063 print STDERR $usage;
64 exit 1;
mjs1151ff22007-10-23 22:27:42 +000065}
66
67sub readResultsFile($)
68{
69 my ($filename) = @_;
darinf7756ca2007-10-24 07:41:45 +000070 open FILE, "<", $filename or die;
mjs1151ff22007-10-23 22:27:42 +000071 my $foundStart = 0;
darin46738432007-10-28 23:08:44 +000072 my $foundOutput = 0;
mjs1151ff22007-10-23 22:27:42 +000073 my $foundEnd = 0;
74 my $result = "";
75 while (<FILE>) {
76 if (!$foundStart) {
darin46738432007-10-28 23:08:44 +000077 if (/^\[\{$/) {
78 $foundStart = 1;
79 $result .= $_;
80 } elsif (/^var \w+ = \[$/) {
81 $foundOutput = 1;
82 } elsif ($foundOutput && /^\{$/) {
83 $foundOutput = 0;
84 $foundStart = 1;
85 $result = "[{\n";
86 }
87 } else {
88 if (/\];?$/) {
89 $foundEnd = 1;
90 chomp;
91 s/;$//;
92 $result .= $_;
93 last;
94 } else {
95 $result .= $_;
96 }
97 }
mjs1151ff22007-10-23 22:27:42 +000098 }
99 close FILE;
100
mjsc71c0a82007-10-30 01:55:13 +0000101 die "Cound not find data in ${filename} - needs to start with [{" unless $foundStart;
102 die "Cound not find data in ${filename} - needs to end with }]" unless $foundEnd;
mjs1151ff22007-10-23 22:27:42 +0000103
104 return $result;
105}
106
107sub dumpToFile($$)
108{
109 my ($contents, $path) = @_;
darinf7756ca2007-10-24 07:41:45 +0000110 open FILE, ">", $path or die;
mjs1151ff22007-10-23 22:27:42 +0000111 print FILE $contents;
112 close FILE;
113}
114
darin@apple.com41a7c172007-11-03 00:15:02 +0000115sub readFile($)
116{
117 my ($path) = @_;
118 open FILE, "<", $path or die;
119 my $result = <FILE>;
120 close FILE;
121 return $result;
122}
123
124sub newestFile($$)
125{
126 my ($dir, $pattern) = @_;
127
128 my $newestAge;
129 my $newestFile = "";
130 opendir DIR, $dir or die;
131 for my $file (readdir DIR) {
132 if ($file =~ $pattern) {
133 my $age = -M "$dir/$file";
134 if (!defined $newestAge || $age < $newestAge) {
135 $newestFile = $file;
136 $newestAge = $age;
137 }
138 }
139 }
140 closedir DIR;
141
142 return "$dir/$newestFile";
143}
144
145my $file1;
146my $file2;
147
148if (scalar @ARGV == 2) {
149 $file1 = $ARGV[0];
150 $file2 = $ARGV[1];
151} else {
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +0000152 $file1 = readFile("$resultDirectory/baseline-filename.txt");
153 $file2 = newestFile("$resultDirectory", qr/sunspider-results-.+\.js$/);
darin@apple.com41a7c172007-11-03 00:15:02 +0000154}
155
156my $output = "var output1 = " . readResultsFile($file1) . ";\n";
157$output .= "var output2 = " . readResultsFile($file2) . ";\n";
mjs1151ff22007-10-23 22:27:42 +0000158
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +0000159dumpToFile($output, "$resultDirectory/sunspider-comparison-data.js");
mjs1151ff22007-10-23 22:27:42 +0000160
bfulgham@webkit.orgcbfd3572009-05-27 00:29:29 +0000161system($jsShellPath, "-f", "$resultDirectory/sunspider-test-prefix.js", "-f", "$resultDirectory/sunspider-comparison-data.js", "-f", "resources/sunspider-compare-results.js", "-f", "resources/sunspider-standalone-compare.js");