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

Reply via email to