diff options
Diffstat (limited to 'PerformanceTests/SunSpider/sunspider-compare-results')
| -rwxr-xr-x | PerformanceTests/SunSpider/sunspider-compare-results | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/PerformanceTests/SunSpider/sunspider-compare-results b/PerformanceTests/SunSpider/sunspider-compare-results new file mode 100755 index 0000000..09b7052 --- /dev/null +++ b/PerformanceTests/SunSpider/sunspider-compare-results @@ -0,0 +1,161 @@ +#!/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 COMPUTER, 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 COMPUTER, 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-0.9.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-0.9.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"); |
