Author: Stephan <step...@stzal.com> Branch: Changeset: r325:7c959c8425bc Date: 2012-12-21 18:47 +0100 http://bitbucket.org/pypy/lang-js/changeset/7c959c8425bc/
Log: moved looping tests into separate suite diff --git a/js/bench/loop/base.js b/js/bench/loop/base.js new file mode 100644 --- /dev/null +++ b/js/bench/loop/base.js @@ -0,0 +1,187 @@ +// Copyright 2008 Google 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: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * 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. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "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 THE COPYRIGHT +// OWNER 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. + + +// Simple framework for running the benchmark suites and +// computing a score based on the timing measurements. + + +// A benchmark has a name (string) and a function that will be run to +// do the performance measurement. +function Benchmark(name, run) { + this.name = name; + this.run = run; +} + + +// Benchmark results hold the benchmark and the measured time used to +// run the benchmark. The benchmark score is computed later once a +// full benchmark suite has run to completion. +function BenchmarkResult(benchmark, time) { + this.benchmark = benchmark; + this.time = time; +} + + +// Automatically convert results to numbers. Used by the geometric +// mean computation. +BenchmarkResult.prototype.valueOf = function() { + return this.time; +}; + + +// Suites of benchmarks consist of a name and the set of benchmarks in +// addition to the reference timing that the final score will be based +// on. This way, all scores are relative to a reference run and higher +// scores implies better performance. +function BenchmarkSuite(name, reference, benchmarks) { + this.name = name; + this.reference = reference; + this.benchmarks = benchmarks; + BenchmarkSuite.suites.push(this); +} + + +// Keep track of all declared benchmark suites. +BenchmarkSuite.suites = []; + + +// Scores are not comparable across versions. Bump the version if +// you're making changes that will affect that scores, e.g. if you add +// a new benchmark or change an existing one. +BenchmarkSuite.version = '1'; + + +// Runs all registered benchmark suites and optionally yields between +// each individual benchmark to avoid running for too long in the +// context of browsers. Once done, the final score is reported to the +// runner. +BenchmarkSuite.RunSuites = function(runner) { + var continuation = null; + var suites = BenchmarkSuite.suites; + var length = suites.length; + BenchmarkSuite.scores = []; + var index = 0; + function RunStep() { + while (continuation || index < length) { + if (continuation) { + continuation = continuation(); + } else { + var suite = suites[index++]; + if (runner.NotifyStart) runner.NotifyStart(suite.name); + continuation = suite.RunStep(runner); + } + if (continuation && typeof window != 'undefined' && window.setTimeout) { + window.setTimeout(RunStep, 100); + return; + } + } + if (runner.NotifyScore) { + var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores); + runner.NotifyScore(Math.round(100 * score)); + } + } + RunStep(); +}; + + +// Counts the total number of registered benchmarks. Useful for +// showing progress as a percentage. +BenchmarkSuite.CountBenchmarks = function() { + var result = 0; + var suites = BenchmarkSuite.suites; + for (var i = 0; i < suites.length; i++) { + result += suites[i].benchmarks.length; + } + return result; +}; + + +// Computes the geometric mean of a set of numbers. +BenchmarkSuite.GeometricMean = function(numbers) { + var log = 0; + for (var i = 0; i < numbers.length; i++) { + log += Math.log(numbers[i]); + } + return Math.pow(Math.E, log / numbers.length); +}; + + +// Notifies the runner that we're done running a single benchmark in +// the benchmark suite. This can be useful to report progress. +BenchmarkSuite.prototype.NotifyStep = function(result) { + this.results.push(result); + if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name); +}; + + +// Notifies the runner that we're done with running a suite and that +// we have a result which can be reported to the user if needed. +BenchmarkSuite.prototype.NotifyResult = function() { + var mean = BenchmarkSuite.GeometricMean(this.results); + var score = this.reference / mean; + BenchmarkSuite.scores.push(score); + if (this.runner.NotifyResult) { + this.runner.NotifyResult(this.name, Math.round(100 * score)); + } +}; + + +// Runs a single benchmark for at least a second and computes the +// average time it takes to run a single iteration. +BenchmarkSuite.prototype.RunSingle = function(benchmark) { + var elapsed = 0; + var start = new Date(); + for (var n = 0; elapsed < 1000; n++) { + benchmark.run(); + elapsed = new Date() - start; + } + var usec = (elapsed * 1000) / n; + this.NotifyStep(new BenchmarkResult(benchmark, usec)); +}; + + +// This function starts running a suite, but stops between each +// individual benchmark in the suite and returns a continuation +// function which can be invoked to run the next benchmark. Once the +// last benchmark has been executed, null is returned. +BenchmarkSuite.prototype.RunStep = function(runner) { + this.results = []; + this.runner = runner; + var length = this.benchmarks.length; + var index = 0; + var suite = this; + function RunNext() { + if (index < length) { + suite.RunSingle(suite.benchmarks[index++]); + return RunNext; + } + suite.NotifyResult(); + return null; + } + return RunNext(); +}; diff --git a/js/bench/loop/looping.js b/js/bench/loop/looping.js new file mode 100644 --- /dev/null +++ b/js/bench/loop/looping.js @@ -0,0 +1,110 @@ +function loop0() { + var x = 0; + while(x < 10000000) { + x += 1; + } +} + +function loop1() { + function f() { + var x = 0; + while(x < 10000000) { + x += 1; + } + } + f(); +} + +function loop2() { + var x = {i:0}; + function f() { + while(x.i < 10000000) { + x.i = x.i + 1; + } + } + f(); +} + +function loop2a() { + function f() { + var x = {i:0}; + while(x.i < 10000000) { + x.i = x.i + 1; + } + } + f(); +} + +function loop3() { + var x = {i:0}; + function f() { + while(x.i < 10000000) { + x = {i:x.i + 1}; + } + } + f(); +} + +function loop3a() { + function f() { + var x = {i:0}; + while(x.i < 10000000) { + x = {i:x.i + 1}; + } + } + f(); +} + +function loop4() { + function g(x) {return x + 1;} + var x = 0; + function f() { + while(x < 10000000) { + x = g(x); + } + } + f(); +} + +function loop4a() { + function f() { + function g(x) {return x + 1;} + var x = 0; + while(x < 10000000) { + x = g(x); + } + } + f(); +} + +new BenchmarkSuite('Looping 0', 100000, [ + new Benchmark('Loop', loop0) +]); + +new BenchmarkSuite('Looping 1', 100000, [ + new Benchmark('Loop', loop1) +]); + +new BenchmarkSuite('Looping 2', 100000, [ + new Benchmark('Loop', loop2) +]); + +new BenchmarkSuite('Looping 2a', 100000, [ + new Benchmark('Loop', loop2a) +]); + +new BenchmarkSuite('Looping 3', 100000, [ + new Benchmark('Loop', loop3) +]); + +new BenchmarkSuite('Looping 3a', 100000, [ + new Benchmark('Loop', loop3a) +]); + +new BenchmarkSuite('Looping 4', 100000, [ + new Benchmark('Loop', loop4) +]); + +new BenchmarkSuite('Looping 4a', 100000, [ + new Benchmark('Loop', loop4a) +]); diff --git a/js/bench/loop/run.js b/js/bench/loop/run.js new file mode 100644 --- /dev/null +++ b/js/bench/loop/run.js @@ -0,0 +1,45 @@ +// Copyright 2008 Google 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: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * 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. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "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 THE COPYRIGHT +// OWNER 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. + + +load('base.js'); +load('looping.js'); + + +function PrintResult(name, result) { + print(name + ': ' + result); +} + + +function PrintScore(score) { + print('----'); + print('Score: ' + score); +} + + +BenchmarkSuite.RunSuites({ NotifyResult: PrintResult, + NotifyScore: PrintScore }); diff --git a/js/bench/v8/v1/run.js b/js/bench/v8/v1/run.js --- a/js/bench/v8/v1/run.js +++ b/js/bench/v8/v1/run.js @@ -27,11 +27,10 @@ load('base.js'); -load('looping.js'); load('richards.js'); -//load('deltablue.js'); +load('deltablue.js'); load('crypto.js'); -////load('raytrace.js'); +//load('raytrace.js'); load('earley-boyer.js'); _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit