[pypy-commit] lang-js default: added loop benchmarks
stepahn
noreply at buildbot.pypy.org
Fri Dec 28 11:35:52 CET 2012
Author: Stephan <stephan at stzal.com>
Branch:
Changeset: r330:a35850255c77
Date: 2012-12-28 11:12 +0100
http://bitbucket.org/pypy/lang-js/changeset/a35850255c77/
Log: added loop benchmarks
diff --git a/js/bench/loop/base.js b/js/bench/loop/base.js
deleted file mode 100644
--- a/js/bench/loop/base.js
+++ /dev/null
@@ -1,187 +0,0 @@
-// 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
deleted file mode 100644
--- a/js/bench/loop/looping.js
+++ /dev/null
@@ -1,110 +0,0 @@
-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
--- a/js/bench/loop/run.js
+++ b/js/bench/loop/run.js
@@ -1,45 +1,100 @@
-// 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 _run(name, func) {
+ var d = Date.now();
+ func();
+ print(name + ': ' + (Date.now() - d));
}
-
-function PrintScore(score) {
- print('----');
- print('Score: ' + score);
+function loop1a() {
+ var x = 0;
+ while(x < 10000000) {
+ x += 1;
+ }
}
+function loop1() {
+ var x = 0;
+ function f() {
+ while(x < 10000000) {
+ x += 1;
+ }
+ }
+ f();
+}
-BenchmarkSuite.RunSuites({ NotifyResult: PrintResult,
- NotifyScore: PrintScore });
+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();
+}
+
+function loop5() {
+ for(var i = 0; i < 10000000; i++) {
+ i;
+ }
+}
+
+_run('loop1', loop1);
+_run('loop1 local', loop1a);
+_run('loop2', loop2);
+_run('loop2 local', loop2a);
+_run('loop3', loop3);
+_run('loop3 local', loop3);
+_run('loop4', loop4);
+_run('loop4 local', loop4);
+_run('loop5', loop5);
More information about the pypy-commit
mailing list