Revision: 4966
Author: [email protected]
Date: Mon Jun 28 05:28:37 2010
Log: Update the V8 benchmark suite with the following fixes:

*) Fix a couple of typos in DeltaBlue.
*) Make sure Splay doesn't always remove the node just added.
*) Run all benchmarks for at least 32 times (and warm up).
Review URL: http://codereview.chromium.org/2836031
http://code.google.com/p/v8/source/detail?r=4966

Modified:
 /branches/bleeding_edge/benchmarks/README.txt
 /branches/bleeding_edge/benchmarks/base.js
 /branches/bleeding_edge/benchmarks/crypto.js
 /branches/bleeding_edge/benchmarks/deltablue.js
 /branches/bleeding_edge/benchmarks/earley-boyer.js
 /branches/bleeding_edge/benchmarks/raytrace.js
 /branches/bleeding_edge/benchmarks/regexp.js
 /branches/bleeding_edge/benchmarks/revisions.html
 /branches/bleeding_edge/benchmarks/richards.js
 /branches/bleeding_edge/benchmarks/run.html
 /branches/bleeding_edge/benchmarks/splay.js

=======================================
--- /branches/bleeding_edge/benchmarks/README.txt       Sun May 16 22:59:20 2010
+++ /branches/bleeding_edge/benchmarks/README.txt       Mon Jun 28 05:28:37 2010
@@ -66,6 +66,12 @@
 Changes from Version 5 to Version 6
 ===================================

-Removed dead code from the RayTrace benchmark and changed the Splay
-benchmark to avoid converting the same numeric key to a string over
-and over again.
+Removed dead code from the RayTrace benchmark and fixed a couple of
+typos in the DeltaBlue implementation. Changed the Splay benchmark to
+avoid converting the same numeric key to a string over and over again
+and to avoid inserting and removing the same element repeatedly thus
+increasing pressure on the memory subsystem.
+
+Furthermore, the benchmark runner was changed to run the benchmarks
+for at least a few times to stabilize the reported numbers on slower
+machines.
=======================================
--- /branches/bleeding_edge/benchmarks/base.js  Sun May 16 22:59:20 2010
+++ /branches/bleeding_edge/benchmarks/base.js  Mon Jun 28 05:28:37 2010
@@ -198,15 +198,33 @@

 // Runs a single benchmark for at least a second and computes the
 // average time it takes to run a single iteration.
-BenchmarkSuite.prototype.RunSingleBenchmark = 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));
+BenchmarkSuite.prototype.RunSingleBenchmark = function(benchmark, data) {
+  function Measure(data) {
+    var elapsed = 0;
+    var start = new Date();
+    for (var n = 0; elapsed < 1000; n++) {
+      benchmark.run();
+      elapsed = new Date() - start;
+    }
+    if (data != null) {
+      data.runs += n;
+      data.elapsed += elapsed;
+    }
+  }
+
+  if (data == null) {
+    // Measure the benchmark once for warm up and throw the result
+    // away. Return a fresh data object.
+    Measure(null);
+    return { runs: 0, elapsed: 0 };
+  } else {
+    Measure(data);
+    // If we've run too few iterations, we continue for another second.
+    if (data.runs < 32) return data;
+    var usec = (data.elapsed * 1000) / data.runs;
+    this.NotifyStep(new BenchmarkResult(benchmark, usec));
+    return null;
+  }
 }


@@ -220,6 +238,7 @@
   var length = this.benchmarks.length;
   var index = 0;
   var suite = this;
+  var data;

   // Run the setup, the actual benchmark, and the tear down in three
   // separate steps to allow the framework to yield between any of the
@@ -241,12 +260,13 @@

   function RunNextBenchmark() {
     try {
-      suite.RunSingleBenchmark(suite.benchmarks[index]);
+      data = suite.RunSingleBenchmark(suite.benchmarks[index], data);
     } catch (e) {
       suite.NotifyError(e);
       return null;
     }
-    return RunNextTearDown;
+    // If data is null, we're done with this benchmark.
+    return (data == null) ? RunNextTearDown : RunNextBenchmark();
   }

   function RunNextTearDown() {
=======================================
--- /branches/bleeding_edge/benchmarks/crypto.js        Thu Oct  2 00:43:46 2008
+++ /branches/bleeding_edge/benchmarks/crypto.js        Mon Jun 28 05:28:37 2010
@@ -31,7 +31,7 @@


 // The code has been adapted for use as a benchmark by Google.
-var Crypto = new BenchmarkSuite('Crypto', 203037, [
+var Crypto = new BenchmarkSuite('Crypto', 110465, [
   new Benchmark("Encrypt", encrypt),
   new Benchmark("Decrypt", decrypt)
 ]);
=======================================
--- /branches/bleeding_edge/benchmarks/deltablue.js     Wed Jul  8 00:35:14 2009
+++ /branches/bleeding_edge/benchmarks/deltablue.js     Mon Jun 28 05:28:37 2010
@@ -23,13 +23,13 @@
 // more like a JavaScript program.


-var DeltaBlue = new BenchmarkSuite('DeltaBlue', 71104, [
+var DeltaBlue = new BenchmarkSuite('DeltaBlue', 30282, [
   new Benchmark('DeltaBlue', deltaBlue)
 ]);


 /**
- * A JavaScript implementation of the DeltaBlue constrain-solving
+ * A JavaScript implementation of the DeltaBlue constraint-solving
  * algorithm, as described in:
  *
  * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
@@ -349,13 +349,13 @@
 BinaryConstraint.inheritsFrom(Constraint);

 /**
- * Decides if this constratint can be satisfied and which way it
+ * Decides if this constraint can be satisfied and which way it
  * should flow based on the relative strength of the variables related,
  * and record that decision.
  */
 BinaryConstraint.prototype.chooseMethod = function (mark) {
   if (this.v1.mark == mark) {
- this.direction = (this.v1.mark != mark && Strength.stronger(this.strength, this.v2.walkStrength)) + this.direction = (this.v2.mark != mark && Strength.stronger(this.strength, this.v2.walkStrength))
       ? Direction.FORWARD
       : Direction.NONE;
   }
=======================================
--- /branches/bleeding_edge/benchmarks/earley-boyer.js Tue May 12 01:23:11 2009 +++ /branches/bleeding_edge/benchmarks/earley-boyer.js Mon Jun 28 05:28:37 2010
@@ -1,7 +1,7 @@
 // This file is automatically generated by scheme2js, except for the
 // benchmark harness code at the beginning and end of the file.

-var EarleyBoyer = new BenchmarkSuite('EarleyBoyer', 765819, [
+var EarleyBoyer = new BenchmarkSuite('EarleyBoyer', 280581, [
   new Benchmark("Earley", function () { BgL_earleyzd2benchmarkzd2(); }),
   new Benchmark("Boyer", function () { BgL_nboyerzd2benchmarkzd2(); })
 ]);
=======================================
--- /branches/bleeding_edge/benchmarks/raytrace.js      Sun May 16 22:59:20 2010
+++ /branches/bleeding_edge/benchmarks/raytrace.js      Mon Jun 28 05:28:37 2010
@@ -8,7 +8,7 @@
 // untouched. This file also contains a copy of parts of the Prototype
 // JavaScript framework which is used by the ray tracer.

-var RayTrace = new BenchmarkSuite('RayTrace', 932666, [
+var RayTrace = new BenchmarkSuite('RayTrace', 533115, [
   new Benchmark('RayTrace', renderScene)
 ]);

=======================================
--- /branches/bleeding_edge/benchmarks/regexp.js        Fri Jan 30 05:19:29 2009
+++ /branches/bleeding_edge/benchmarks/regexp.js        Mon Jun 28 05:28:37 2010
@@ -35,7 +35,7 @@
 // letters in the data are encoded using ROT13 in a way that does not
 // affect how the regexps match their input.

-var RegRxp = new BenchmarkSuite('RegExp', 995230, [
+var RegRxp = new BenchmarkSuite('RegExp', 601250, [
   new Benchmark("RegExp", runRegExpBenchmark)
 ]);

=======================================
--- /branches/bleeding_edge/benchmarks/revisions.html Sun May 16 22:59:20 2010 +++ /branches/bleeding_edge/benchmarks/revisions.html Mon Jun 28 05:28:37 2010
@@ -22,10 +22,15 @@

<div class="subtitle"><h3>Version 6 (<a href="http://v8.googlecode.com/svn/data/benchmarks/v6/run.html";>link</a>)</h3></div>

-<p>Removed dead code from the RayTrace benchmark and changed the Splay
-benchmark to avoid converting the same numeric key to a string over
-and over again.
-</p>
+<p>Removed dead code from the RayTrace benchmark and fixed a couple of
+typos in the DeltaBlue implementation. Changed the Splay benchmark to
+avoid converting the same numeric key to a string over and over again
+and to avoid inserting and removing the same element repeatedly thus
+increasing pressure on the memory subsystem.</p>
+
+<p>Furthermore, the benchmark runner was changed to run the benchmarks
+for at least a few times to stabilize the reported numbers on slower
+machines.</p>

<div class="subtitle"><h3>Version 5 (<a href="http://v8.googlecode.com/svn/data/benchmarks/v5/run.html";>link</a>)</h3></div>

=======================================
--- /branches/bleeding_edge/benchmarks/richards.js      Tue May 12 01:23:11 2009
+++ /branches/bleeding_edge/benchmarks/richards.js      Mon Jun 28 05:28:37 2010
@@ -35,7 +35,7 @@
 // Martin Richards.


-var Richards = new BenchmarkSuite('Richards', 34886, [
+var Richards = new BenchmarkSuite('Richards', 20687, [
   new Benchmark("Richards", runRichards)
 ]);

=======================================
--- /branches/bleeding_edge/benchmarks/run.html Sun May 16 22:59:20 2010
+++ /branches/bleeding_edge/benchmarks/run.html Mon Jun 28 05:28:37 2010
@@ -116,7 +116,7 @@
<li><b>RegExp</b><br>Regular expression benchmark generated by extracting regular expression operations from 50 of the most popular web pages
 (<i>1614 lines</i>).
 </li>
-<li><b>Splay</b><br>Data manipulation benchmark that deals with splay trees and exercises the automatic memory management subsystem (<i>379 lines</i>).</li> +<li><b>Splay</b><br>Data manipulation benchmark that deals with splay trees and exercises the automatic memory management subsystem (<i>394 lines</i>).</li>
 </ul>

 <p>
=======================================
--- /branches/bleeding_edge/benchmarks/splay.js Sun May 16 22:59:20 2010
+++ /branches/bleeding_edge/benchmarks/splay.js Mon Jun 28 05:28:37 2010
@@ -33,7 +33,7 @@
 // also has to deal with a lot of changes to the large tree object
 // graph.

-var Splay = new BenchmarkSuite('Splay', 126125, [
+var Splay = new BenchmarkSuite('Splay', 21915, [
   new Benchmark("Splay", SplayRun, SplaySetup, SplayTearDown)
 ]);

@@ -230,9 +230,24 @@
 };


+/**
+ * @return {SplayTree.Node} Node having the maximum key value.
+ */
+SplayTree.prototype.findMax = function(opt_startNode) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = opt_startNode || this.root_;
+  while (current.right) {
+    current = current.right;
+  }
+  return current;
+};
+
+
 /**
  * @return {SplayTree.Node} Node having the maximum key value that
- *     is less or equal to the specified key value.
+ *     is less than the specified key value.
  */
 SplayTree.prototype.findGreatestLessThan = function(key) {
   if (this.isEmpty()) {
@@ -243,7 +258,7 @@
   this.splay_(key);
   // Now the result is either the root node or the greatest node in
   // the left subtree.
-  if (this.root_.key <= key) {
+  if (this.root_.key < key) {
     return this.root_;
   } else if (this.root_.left) {
     return this.findMax(this.root_.left);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to