| #!/usr/bin/perl -w |
| |
| # Copyright (C) 2007 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| use strict; |
| use Getopt::Long; |
| use File::Basename; |
| |
| my $showHelp = 0; |
| my $jsShellPath; |
| my $suite = ""; |
| my $ubench = 0; |
| my $v8suite = 0; |
| my $parseOnly = 0; |
| |
| my $programName = basename($0); |
| my $usage = <<EOF; |
| Usage: $programName --shell=[path] [options] FILE FILE |
| --help Show this help message |
| --shell Path to javascript shell |
| --suite Select a specific benchmark suite. The default is sunspider-1.0.1 |
| --ubench Use microbenchmark suite instead of regular tests. Same as --suite=ubench |
| --v8-suite Use the V8 benchmark suite. Same as --suite=v8-v4 |
| --parse-only Compare the parse-only benchmark results |
| EOF |
| |
| GetOptions('shell=s' => \$jsShellPath, |
| 'suite=s' => \$suite, |
| 'ubench' => \$ubench, |
| 'v8-suite' => \$v8suite, |
| 'parse-only' => \$parseOnly, |
| 'help' => \$showHelp); |
| |
| $suite = "ubench" if ($ubench); |
| $suite = "v8-v4" if ($v8suite); |
| $suite = "parse-only" if ($parseOnly); |
| $suite = "sunspider-1.0.1" if (!$suite); |
| |
| my $resultDirectory = "${suite}-results"; |
| |
| if ((scalar @ARGV != 0 && scalar @ARGV != 2) || !$jsShellPath || $showHelp) { |
| print STDERR $usage; |
| exit 1; |
| } |
| |
| sub readResultsFile($) |
| { |
| my ($filename) = @_; |
| open FILE, "<", $filename or die; |
| my $foundStart = 0; |
| my $foundOutput = 0; |
| my $foundEnd = 0; |
| my $result = ""; |
| while (<FILE>) { |
| if (!$foundStart) { |
| if (/^\[\{$/) { |
| $foundStart = 1; |
| $result .= $_; |
| } elsif (/^var \w+ = \[$/) { |
| $foundOutput = 1; |
| } elsif ($foundOutput && /^\{$/) { |
| $foundOutput = 0; |
| $foundStart = 1; |
| $result = "[{\n"; |
| } |
| } else { |
| if (/\];?$/) { |
| $foundEnd = 1; |
| chomp; |
| s/;$//; |
| $result .= $_; |
| last; |
| } else { |
| $result .= $_; |
| } |
| } |
| } |
| close FILE; |
| |
| die "Cound not find data in ${filename} - needs to start with [{" unless $foundStart; |
| die "Cound not find data in ${filename} - needs to end with }]" unless $foundEnd; |
| |
| return $result; |
| } |
| |
| sub dumpToFile($$) |
| { |
| my ($contents, $path) = @_; |
| open FILE, ">", $path or die; |
| print FILE $contents; |
| close FILE; |
| } |
| |
| sub readFile($) |
| { |
| my ($path) = @_; |
| open FILE, "<", $path or die; |
| my $result = <FILE>; |
| close FILE; |
| return $result; |
| } |
| |
| sub newestFile($$) |
| { |
| my ($dir, $pattern) = @_; |
| |
| my $newestAge; |
| my $newestFile = ""; |
| opendir DIR, $dir or die; |
| for my $file (readdir DIR) { |
| if ($file =~ $pattern) { |
| my $age = -M "$dir/$file"; |
| if (!defined $newestAge || $age < $newestAge) { |
| $newestFile = $file; |
| $newestAge = $age; |
| } |
| } |
| } |
| closedir DIR; |
| |
| return "$dir/$newestFile"; |
| } |
| |
| my $file1; |
| my $file2; |
| |
| if (scalar @ARGV == 2) { |
| $file1 = $ARGV[0]; |
| $file2 = $ARGV[1]; |
| } else { |
| $file1 = readFile("$resultDirectory/baseline-filename.txt"); |
| $file2 = newestFile("$resultDirectory", qr/sunspider-results-.+\.js$/); |
| } |
| |
| my $output = "var output1 = " . readResultsFile($file1) . ";\n"; |
| $output .= "var output2 = " . readResultsFile($file2) . ";\n"; |
| |
| dumpToFile($output, "$resultDirectory/sunspider-comparison-data.js"); |
| |
| system($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"); |