Author: Stephan <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit