diff options
author | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
---|---|---|
committer | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
commit | d8543bb6618c17b12da906afa77d216f58cf4058 (patch) | |
tree | c58dc05ed86825bd0ef8d305d58c8205106b540f /SunSpider/sunspider | |
download | external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.zip external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.gz external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.bz2 |
external/webkit r30707
Diffstat (limited to 'SunSpider/sunspider')
-rwxr-xr-x | SunSpider/sunspider | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/SunSpider/sunspider b/SunSpider/sunspider new file mode 100755 index 0000000..da8634f --- /dev/null +++ b/SunSpider/sunspider @@ -0,0 +1,214 @@ +#!/usr/bin/perl -w + +# Copyright (C) 2007 Apple Inc. All rights reserved. +# Copyright (C) 2007 Eric Seidel <eric@webkit.org> +# +# 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; +use File::Spec; +use Cwd; +use POSIX qw(strftime); + +my $showHelp = 0; +my $runShark = 0; +my $runShark20 = 0; +my $runSharkCache = 0; +my $jsShellPath; +my $setBaseline = 0; +my $testsPattern; +my $testRuns = 10; + +my $programName = basename($0); +my $usage = <<EOF; +Usage: $programName --shell=[path] [options] + --help Show this help message + --set-baseline Set baseline for future comparisons + --shell Path to JavaScript shell + --runs Number of times to run tests (default: $testRuns) + --tests Only run tests matching provided pattern + --shark Sample execution time with the Mac OS X "Shark" performance testing tool (implies --runs=1) + --shark20 Like --shark, but with a 20 microsecond sampling interval + --shark-cache Like --shark, but performs a L2 cache-miss sample instead of time sample +EOF + +GetOptions('runs=i' => \$testRuns, + 'set-baseline' => \$setBaseline, + 'shell=s' => \$jsShellPath, + 'shark' => \$runShark, + 'shark20' => \$runShark20, + 'shark-cache' => \$runSharkCache, + 'tests=s' => \$testsPattern, + 'help' => \$showHelp); + +$runShark = 1 if $runSharkCache; +$runShark = 20 if $runShark20; +$testRuns = 1 if $runShark; +if ($runShark && ! -x "/usr/bin/shark") { + die "Please install CHUD tools from http://developer.apple.com/tools/download/\n"; +} + +my $sharkCacheProfileIndex = 0; +if ($runSharkCache) { + my $sharkProfileList = `shark -l 2>&1`; + for my $profile (split(/\n/, $sharkProfileList)) { + $profile =~ /(\d+) - (.+)/; + next unless (defined $1); + my $profileIndex = $1; + my $profileName = $2; + if ($profileName =~ /L2 Cache/) { + $sharkCacheProfileIndex = $profileIndex; + print "Using Shark L2 Cache Miss Profile: " . $profile . "\n"; + last; + } + } + die "Failed to find L2 Cache Miss Profile for --shark-cache\n" unless ($sharkCacheProfileIndex); +} + +if (!$jsShellPath || $showHelp) { + print STDERR $usage; + exit 1; +} + +sub dumpToFile($$) +{ + my ($contents, $path) = @_; + open FILE, ">", $path or die "Failed to open $path"; + print FILE $contents; + close FILE; +} + +my @tests = (); +my @categories = (); +my %uniqueCategories = (); + +sub loadTestsList() +{ + open TESTLIST, "<", "tests/LIST" or die "Can't find ./tests/LIST"; + while (<TESTLIST>) { + chomp; + next unless !$testsPattern || /$testsPattern/; + + push @tests, $_; + my $category = $_; + $category =~ s/-.*//; + if (!$uniqueCategories{$category}) { + push @categories, $category; + $uniqueCategories{$category} = $category; + } + } + close TESTLIST; +} + +my $timeString = strftime "%Y-%m-%d-%H.%M.%S", localtime $^T; +my $prefixFile = "tmp/sunspider-test-prefix.js"; +my $resultsFile = "tmp/sunspider-results-$timeString.js"; + +sub writePrefixFile() +{ + my $prefix = "var tests = [ " . join(", ", map { '"' . $_ . '"' } @tests) . " ];\n"; + $prefix .= "var categories = [ " . join(", ", map { '"' . $_ . '"' } @categories) . " ];\n"; + + mkdir "tmp"; + dumpToFile($prefix, $prefixFile); +} + +sub runTestsOnce($) +{ + my ($useShark) = @_; + my $shellArgs = "-f $prefixFile -f resources/sunspider-standalone-driver.js 2> /dev/null"; + my $output; + if ($useShark) { + my $intervalArg = $useShark == 20 ? "-I 20u" : ""; + my $cacheArg = $runSharkCache ? "-c $sharkCacheProfileIndex" : ""; + $output = `shark $intervalArg $cacheArg -i -1-q "$jsShellPath" $shellArgs`; + } else { + $output = `"$jsShellPath" $shellArgs | grep -v break`; + } + return $output; +} + +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"; +} + +loadTestsList(); +if ($testsPattern) { + print STDERR "Found " . scalar(@tests) . " tests matching '" . $testsPattern . "'\n"; +} else { + print STDERR "Found " . scalar(@tests) . " tests\n"; +} +die "No tests to run" unless scalar(@tests); +print STDERR "Running SunSpider once for warmup, then " . ($runShark ? "under Shark" : "$testRuns time" . ($testRuns == 1 ? "" : "s")) . "\n"; +writePrefixFile(); + +runTestsOnce(0); +print "Discarded first run.\n"; + +my $result; +my $count = 0; +my @results = (); +my $total = 0; +print "["; +while ($count++ < $testRuns) { + $result = runTestsOnce($runShark); + $result =~ s/\r\n/\n/g; + chomp $result; + push @results, $result; + print $result; + print ",\n" unless ($count == $testRuns); +} +print "]\n"; + +my $output = "var output = [\n" . join(",\n", @results) . "\n];\n"; +dumpToFile($output, $resultsFile); +dumpToFile(File::Spec->rel2abs($resultsFile), "tmp/baseline-filename.txt") if $setBaseline; + +system("$jsShellPath", "-f", $prefixFile, "-f", $resultsFile, "-f", "resources/sunspider-analyze-results.js"); + +if ($runShark) { + my $newestMShark = newestFile(".", qr/\.mshark$/); + if ($newestMShark) { + my $profileFile = "tmp/sunspider-profile-$timeString.mshark"; + rename $newestMShark, $profileFile or die; + exec "/usr/bin/open", $profileFile; + } +} |