[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