summaryrefslogtreecommitdiff
path: root/src/3rdparty/v8/benchmarks/spinning-balls/v.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/v8/benchmarks/spinning-balls/v.js')
-rw-r--r--src/3rdparty/v8/benchmarks/spinning-balls/v.js498
1 files changed, 0 insertions, 498 deletions
diff --git a/src/3rdparty/v8/benchmarks/spinning-balls/v.js b/src/3rdparty/v8/benchmarks/spinning-balls/v.js
deleted file mode 100644
index 5ae1194..0000000
--- a/src/3rdparty/v8/benchmarks/spinning-balls/v.js
+++ /dev/null
@@ -1,498 +0,0 @@
-// Copyright 2011 the V8 project authors. 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.
-
-
-/**
- * This function provides requestAnimationFrame in a cross browser way.
- * http://paulirish.com/2011/requestanimationframe-for-smart-animating/
- */
-if ( !window.requestAnimationFrame ) {
- window.requestAnimationFrame = ( function() {
- return window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(callback, element) {
- window.setTimeout( callback, 1000 / 60 );
- };
- } )();
-}
-
-var kNPoints = 8000;
-var kNModifications = 20;
-var kNVisiblePoints = 200;
-var kDecaySpeed = 20;
-
-var kPointRadius = 4;
-var kInitialLifeForce = 100;
-
-var livePoints = void 0;
-var dyingPoints = void 0;
-var scene = void 0;
-var renderingStartTime = void 0;
-var scene = void 0;
-var pausePlot = void 0;
-var splayTree = void 0;
-var numberOfFrames = 0;
-var sumOfSquaredPauses = 0;
-var benchmarkStartTime = void 0;
-var benchmarkTimeLimit = void 0;
-var autoScale = void 0;
-var pauseDistribution = [];
-
-
-function Point(x, y, z, payload) {
- this.x = x;
- this.y = y;
- this.z = z;
-
- this.next = null;
- this.prev = null;
- this.payload = payload;
- this.lifeForce = kInitialLifeForce;
-}
-
-
-Point.prototype.color = function () {
- return "rgba(0, 0, 0, " + (this.lifeForce / kInitialLifeForce) + ")";
-};
-
-
-Point.prototype.decay = function () {
- this.lifeForce -= kDecaySpeed;
- return this.lifeForce <= 0;
-};
-
-
-function PointsList() {
- this.head = null;
- this.count = 0;
-}
-
-
-PointsList.prototype.add = function (point) {
- if (this.head !== null) this.head.prev = point;
- point.next = this.head;
- this.head = point;
- this.count++;
-}
-
-
-PointsList.prototype.remove = function (point) {
- if (point.next !== null) {
- point.next.prev = point.prev;
- }
- if (point.prev !== null) {
- point.prev.next = point.next;
- } else {
- this.head = point.next;
- }
- this.count--;
-}
-
-
-function GeneratePayloadTree(depth, tag) {
- if (depth == 0) {
- return {
- array : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
- string : 'String for key ' + tag + ' in leaf node'
- };
- } else {
- return {
- left: GeneratePayloadTree(depth - 1, tag),
- right: GeneratePayloadTree(depth - 1, tag)
- };
- }
-}
-
-
-// To make the benchmark results predictable, we replace Math.random
-// with a 100% deterministic alternative.
-Math.random = (function() {
- var seed = 49734321;
- return function() {
- // Robert Jenkins' 32 bit integer hash function.
- seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff;
- seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
- seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff;
- seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff;
- seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff;
- seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
- return (seed & 0xfffffff) / 0x10000000;
- };
-})();
-
-
-function GenerateKey() {
- // The benchmark framework guarantees that Math.random is
- // deterministic; see base.js.
- return Math.random();
-}
-
-function CreateNewPoint() {
- // Insert new node with a unique key.
- var key;
- do { key = GenerateKey(); } while (splayTree.find(key) != null);
-
- var point = new Point(Math.random() * 40 - 20,
- Math.random() * 40 - 20,
- Math.random() * 40 - 20,
- GeneratePayloadTree(5, "" + key));
-
- livePoints.add(point);
-
- splayTree.insert(key, point);
- return key;
-}
-
-function ModifyPointsSet() {
- if (livePoints.count < kNPoints) {
- for (var i = 0; i < kNModifications; i++) {
- CreateNewPoint();
- }
- } else if (kNModifications === 20) {
- kNModifications = 80;
- kDecay = 30;
- }
-
- for (var i = 0; i < kNModifications; i++) {
- var key = CreateNewPoint();
- var greatest = splayTree.findGreatestLessThan(key);
- if (greatest == null) {
- var point = splayTree.remove(key).value;
- } else {
- var point = splayTree.remove(greatest.key).value;
- }
- livePoints.remove(point);
- point.payload = null;
- dyingPoints.add(point);
- }
-}
-
-
-function PausePlot(width, height, size, scale) {
- var canvas = document.createElement("canvas");
- canvas.width = this.width = width;
- canvas.height = this.height = height;
- document.body.appendChild(canvas);
-
- this.ctx = canvas.getContext('2d');
-
- if (typeof scale !== "number") {
- this.autoScale = true;
- this.maxPause = 0;
- } else {
- this.autoScale = false;
- this.maxPause = scale;
- }
-
- this.size = size;
-
- // Initialize cyclic buffer for pauses.
- this.pauses = new Array(this.size);
- this.start = this.size;
- this.idx = 0;
-}
-
-
-PausePlot.prototype.addPause = function (p) {
- if (this.idx === this.size) {
- this.idx = 0;
- }
-
- if (this.idx === this.start) {
- this.start++;
- }
-
- if (this.start === this.size) {
- this.start = 0;
- }
-
- this.pauses[this.idx++] = p;
-};
-
-
-PausePlot.prototype.iteratePauses = function (f) {
- if (this.start < this.idx) {
- for (var i = this.start; i < this.idx; i++) {
- f.call(this, i - this.start, this.pauses[i]);
- }
- } else {
- for (var i = this.start; i < this.size; i++) {
- f.call(this, i - this.start, this.pauses[i]);
- }
-
- var offs = this.size - this.start;
- for (var i = 0; i < this.idx; i++) {
- f.call(this, i + offs, this.pauses[i]);
- }
- }
-};
-
-
-PausePlot.prototype.draw = function () {
- var first = null;
-
- if (this.autoScale) {
- this.iteratePauses(function (i, v) {
- if (first === null) {
- first = v;
- }
- this.maxPause = Math.max(v, this.maxPause);
- });
- }
-
- var dx = this.width / this.size;
- var dy = this.height / this.maxPause;
-
- this.ctx.save();
- this.ctx.clearRect(0, 0, this.width, this.height);
- this.ctx.beginPath();
- this.ctx.moveTo(1, dy * this.pauses[this.start]);
- var p = first;
- this.iteratePauses(function (i, v) {
- var delta = v - p;
- var x = 1 + dx * i;
- var y = dy * v;
- this.ctx.lineTo(x, y);
- if (delta > 2 * (p / 3)) {
- this.ctx.font = "bold 12px sans-serif";
- this.ctx.textBaseline = "bottom";
- this.ctx.fillText(v + "ms", x + 2, y);
- }
- p = v;
- });
- this.ctx.strokeStyle = "black";
- this.ctx.stroke();
- this.ctx.restore();
-}
-
-
-function Scene(width, height) {
- var canvas = document.createElement("canvas");
- canvas.width = width;
- canvas.height = height;
- document.body.appendChild(canvas);
-
- this.ctx = canvas.getContext('2d');
- this.width = canvas.width;
- this.height = canvas.height;
-
- // Projection configuration.
- this.x0 = canvas.width / 2;
- this.y0 = canvas.height / 2;
- this.z0 = 100;
- this.f = 1000; // Focal length.
-
- // Camera is rotating around y-axis.
- this.angle = 0;
-}
-
-
-Scene.prototype.drawPoint = function (x, y, z, color) {
- // Rotate the camera around y-axis.
- var rx = x * Math.cos(this.angle) - z * Math.sin(this.angle);
- var ry = y;
- var rz = x * Math.sin(this.angle) + z * Math.cos(this.angle);
-
- // Perform perspective projection.
- var px = (this.f * rx) / (rz - this.z0) + this.x0;
- var py = (this.f * ry) / (rz - this.z0) + this.y0;
-
- this.ctx.save();
- this.ctx.fillStyle = color
- this.ctx.beginPath();
- this.ctx.arc(px, py, kPointRadius, 0, 2 * Math.PI, true);
- this.ctx.fill();
- this.ctx.restore();
-};
-
-
-Scene.prototype.drawDyingPoints = function () {
- var point_next = null;
- for (var point = dyingPoints.head; point !== null; point = point_next) {
- // Rotate the scene around y-axis.
- scene.drawPoint(point.x, point.y, point.z, point.color());
-
- point_next = point.next;
-
- // Decay the current point and remove it from the list
- // if it's life-force ran out.
- if (point.decay()) {
- dyingPoints.remove(point);
- }
- }
-};
-
-
-Scene.prototype.draw = function () {
- this.ctx.save();
- this.ctx.clearRect(0, 0, this.width, this.height);
- this.drawDyingPoints();
- this.ctx.restore();
-
- this.angle += Math.PI / 90.0;
-};
-
-
-function updateStats(pause) {
- numberOfFrames++;
- if (pause > 20) {
- sumOfSquaredPauses += (pause - 20) * (pause - 20);
- }
- pauseDistribution[Math.floor(pause / 10)] |= 0;
- pauseDistribution[Math.floor(pause / 10)]++;
-}
-
-
-function renderStats() {
- var msg = document.createElement("p");
- msg.innerHTML = "Score " +
- Math.round(numberOfFrames * 1000 / sumOfSquaredPauses);
- var table = document.createElement("table");
- table.align = "center";
- for (var i = 0; i < pauseDistribution.length; i++) {
- if (pauseDistribution[i] > 0) {
- var row = document.createElement("tr");
- var time = document.createElement("td");
- var count = document.createElement("td");
- time.innerHTML = i*10 + "-" + (i+1)*10 + "ms";
- count.innerHTML = " => " + pauseDistribution[i];
- row.appendChild(time);
- row.appendChild(count);
- table.appendChild(row);
- }
- }
- div.appendChild(msg);
- div.appendChild(table);
-}
-
-
-function render() {
- if (typeof renderingStartTime === 'undefined') {
- renderingStartTime = Date.now();
- benchmarkStartTime = renderingStartTime;
- }
-
- ModifyPointsSet();
-
- scene.draw();
-
- var renderingEndTime = Date.now();
- var pause = renderingEndTime - renderingStartTime;
- pausePlot.addPause(pause);
- renderingStartTime = renderingEndTime;
-
- pausePlot.draw();
-
- updateStats(pause);
-
- div.innerHTML =
- livePoints.count + "/" + dyingPoints.count + " " +
- pause + "(max = " + pausePlot.maxPause + ") ms " +
- numberOfFrames + " frames";
-
- if (renderingEndTime < benchmarkStartTime + benchmarkTimeLimit) {
- // Schedule next frame.
- requestAnimationFrame(render);
- } else {
- renderStats();
- }
-}
-
-
-function Form() {
- function create(tag) { return document.createElement(tag); }
- function text(value) { return document.createTextNode(value); }
-
- this.form = create("form");
- this.form.setAttribute("action", "javascript:start()");
-
- var table = create("table");
- table.setAttribute("style", "margin-left: auto; margin-right: auto;");
-
- function col(a) {
- var td = create("td");
- td.appendChild(a);
- return td;
- }
-
- function row(a, b) {
- var tr = create("tr");
- tr.appendChild(col(a));
- tr.appendChild(col(b));
- return tr;
- }
-
- this.timelimit = create("input");
- this.timelimit.setAttribute("value", "60");
-
- table.appendChild(row(text("Time limit in seconds"), this.timelimit));
-
- this.autoscale = create("input");
- this.autoscale.setAttribute("type", "checkbox");
- this.autoscale.setAttribute("checked", "true");
- table.appendChild(row(text("Autoscale pauses plot"), this.autoscale));
-
- var button = create("input");
- button.setAttribute("type", "submit");
- button.setAttribute("value", "Start");
- this.form.appendChild(table);
- this.form.appendChild(button);
-
- document.body.appendChild(this.form);
-}
-
-
-Form.prototype.remove = function () {
- document.body.removeChild(this.form);
-};
-
-
-function init() {
- livePoints = new PointsList;
- dyingPoints = new PointsList;
-
- splayTree = new SplayTree();
-
- scene = new Scene(640, 480);
-
- div = document.createElement("div");
- document.body.appendChild(div);
-
- pausePlot = new PausePlot(480, autoScale ? 240 : 500, 160, autoScale ? void 0 : 500);
-}
-
-function start() {
- benchmarkTimeLimit = form.timelimit.value * 1000;
- autoScale = form.autoscale.checked;
- form.remove();
- init();
- render();
-}
-
-var form = new Form();