Browse Source

Reintroduce benchmarks (unchanged)

Tristan VALCKE 7 years ago
parent
commit
83fe533cc1

+ 40 - 0
test/benchmark/README.MD

@@ -0,0 +1,40 @@
+# THREEJS Benchmark Suite
+
+### Example: Adding a New Suite
+
+For adding a new Tests we need two things
+ - Adding the Test File
+ - Linking it on the benchmark.html page
+
+Some example could be like this
+```javascript
+(function() {
+  // We want to make sure THREE.JS is loaded for this Benchmark
+  var THREE
+  if (Bench.isTHREELoaded()) {
+    THREE = Bench.THREE;
+  } else {
+    Bench.warning("Test Example Benchmark not loaded because THREEJS was not loaded");
+    return;
+  }
+
+  var s = Bench.newSuite("Example Benchmark Distance Calculation");
+
+  var v2a = new THREE.Vector2(3.0, 3.0);
+  var v2b = new THREE.Vector2(9.0, -3.0);
+
+  var v3a = new THREE.Vector3(3.0, 3.0, 0.0);
+  var v3b = new THREE.Vector3(9.0, -3.0, 0.0);
+
+  s.add("Vector3", function() {
+    v3a.distanceTo(v3b);
+  })
+
+  s.add("Vector2", function() {
+    v2a.distanceTo(v2b);
+
+  })
+})();
+```
+
+Remember that THREEJS library is only accesible via `Bench.THREE`

+ 79 - 0
test/benchmark/benchmark.js

@@ -0,0 +1,79 @@
+var BenchClass = function() {
+  this.suites = [];
+  this.THREE = window.THREE ;
+  window.THREE = undefined;
+  Benchmark.options.maxTime = 1.0;
+  return this;
+}
+
+BenchClass.prototype.isTHREELoaded = function() {
+  return _.isObject(this.THREE);
+}
+
+BenchClass.prototype.newSuite = function(name) {
+  var s = new Benchmark.Suite(name);
+  this.suites.push(s);
+  return s;
+}
+
+BenchClass.prototype.display = function() {
+  for (x of this.suites) {
+    var s = new SuiteUI(x);
+    s.render();
+  }
+}
+
+BenchClass.prototype.warning = function(message) {
+  console.error(message);
+}
+
+var SuiteUI = function(suite) {
+  this.suite = suite;
+  this.isRunning = false;
+  return this;
+}
+
+SuiteUI.prototype.render = function() {
+  var n = document.importNode(this.suiteTemplate, true);
+  this.elem = n.querySelector("article");
+  this.results = n.querySelector(".results");
+  this.title = n.querySelector("h2");
+  this.runButton = n.querySelector("h3");
+
+  this.title.innerText = this.suite.name;
+  this.runButton.onclick = this.run.bind(this);
+
+  this.section.appendChild(n);
+}
+
+SuiteUI.prototype.run = function() {
+  this.runButton.click = _.noop;
+  this.runButton.innerText = "Running..."
+  this.suite.on("complete", this.complete.bind(this));
+  this.suite.run({
+    async: true
+  });
+}
+
+SuiteUI.prototype.complete = function() {
+  this.runButton.style.display = "none";
+  this.results.style.display = "block";
+  var f = _.orderBy(this.suite, ["hz"], ["desc"]);
+  for (var i = 0; i < f.length; i++) {
+    var x = f[i];
+    var n = document.importNode(this.suiteTestTemplate, true);
+    n.querySelector(".name").innerText = x.name;
+    n.querySelector(".ops").innerText = x.hz.toFixed();
+    n.querySelector(".desv").innerText = x.stats.rme.toFixed(2);
+    this.results.appendChild(n);
+  }
+}
+
+var Bench = new BenchClass();
+window.addEventListener('load', function() {
+  SuiteUI.prototype.suiteTemplate = document.querySelector("#suite").content;
+  SuiteUI.prototype.suiteTestTemplate = document.querySelector("#suite-test").content;
+  SuiteUI.prototype.section = document.querySelector("section");
+
+  Bench.display();
+})

+ 51 - 0
test/benchmark/benchmarks.html

@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>ThreeJS Benchmark Tests - Using Files in /src</title>
+  <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:700" rel="stylesheet" type="text/css">
+  <link href="normalize.css" rel="stylesheet" type="text/css">
+  <link href="style.css" rel="stylesheet" type="text/css">
+  <script src="../../build/three.min.js"></script>
+  <script src="vendor/lodash.min.js"></script>
+  <script src="vendor/benchmark-2.1.0.min.js"></script>
+  <script src="benchmark.js"></script>
+
+  <script src="core/Vector3Components.js"></script>
+  <script src="core/Vector3Storage.js"></script>
+  <script src="core/Vector3Length.js"></script>
+  <script src="core/Float32Array.js"></script>
+</head>
+<body>
+  <header>
+    <h1>Three JS Benchmarks Suite</h1>
+  </header>
+  <section>
+  </section>
+
+  <template id="suite">
+    <article>
+      <header>
+        <h2></h2>
+        <h3>Start</h3>
+      </header>
+      <div class="results">
+        <div class"head">
+          <p class="name">Name</p>
+          <p class="ops">Ops / Sec</p>
+          <p class="desv">±</p>
+        </div>
+      </div>
+    </article>
+  </template>
+
+  <template id="suite-test">
+    <div>
+      <p class="name"></p>
+      <p class="ops"></p>
+      <p class="desv"></p>
+    </div>
+  </template>
+
+</body>
+</html>

+ 82 - 0
test/benchmark/core/Float32Array.js

@@ -0,0 +1,82 @@
+(function() {
+
+  var input = new Float32Array(10000 * 3);
+  var output = new Float32Array(10000 * 3);
+
+  for (var j = 0, jl = input.length; j < jl; j++) {
+    input[j] = j;
+  }
+
+  var inputVectors = [];
+  var outputVectors = [];
+
+  for (var j = 0, jl = input.length / 3; j < jl; j++) {
+    inputVectors.push(new THREE.Vector3(j * 3, j * 3 + 1, j * 3 + 2));
+    outputVectors.push(new THREE.Vector3());
+  }
+
+  var s = Bench.newSuite("Float 32 Arrays");
+
+  s.add('Float32Array-Float32Array', function() {
+    var value3 = new Float32Array(3);
+    for (var i = 0, il = input.length / 3; i < il; i += 3) {
+      value3[0] = input[i + 0];
+      value3[1] = input[i + 1];
+      value3[2] = input[i + 2];
+      value3[0] *= 1.01;
+      value3[1] *= 1.03;
+      value3[2] *= 0.98;
+      output[i + 0] = value3[0];
+      output[i + 1] = value3[1];
+      output[i + 2] = value3[2];
+    }
+  });
+
+  s.add('Float32Array-Array', function() {
+    var value2 = [0, 0, 0];
+    for (var i = 0, il = input.length / 3; i < il; i += 3) {
+      value2[0] = input[i + 0];
+      value2[1] = input[i + 1];
+      value2[2] = input[i + 2];
+      value2[0] *= 1.01;
+      value2[1] *= 1.03;
+      value2[2] *= 0.98;
+      output[i + 0] = value2[0];
+      output[i + 1] = value2[1];
+      output[i + 2] = value2[2];
+    }
+  });
+
+  s.add('Float32Array-Literal', function() {
+    var x,
+      y,
+      z;
+    for (var i = 0, il = input.length / 3; i < il; i += 3) {
+      x = input[i + 0];
+      y = input[i + 1];
+      z = input[i + 2];
+      x *= 1.01;
+      y *= 1.03;
+      z *= 0.98;
+      output[i + 0] = x;
+      output[i + 1] = y;
+      output[i + 2] = z;
+    }
+  });
+
+  s.add('Float32Array-Vector3', function() {
+    var value = new THREE.Vector3();
+    for (var i = 0, il = input.length / 3; i < il; i += 3) {
+      value.x = input[i + 0];
+      value.y = input[i + 1];
+      value.z = input[i + 2];
+      value.x *= 1.01;
+      value.y *= 1.03;
+      value.z *= 0.98;
+      output[i + 0] = value.x;
+      output[i + 1] = value.y;
+      output[i + 2] = value.z;
+    }
+  });
+
+})();

+ 110 - 0
test/benchmark/core/Vector3Components.js

@@ -0,0 +1,110 @@
+(function() {
+
+  var s = Bench.newSuite("Vector 3 Components");
+
+  THREE = {};
+
+  THREE.Vector3 = function(x, y, z) {
+    this.x = x || 0;
+    this.y = y || 0;
+    this.z = z || 0;
+  };
+
+  THREE.Vector3.prototype = {
+    constructor: THREE.Vector3,
+    setComponent: function(index, value) {
+      this[THREE.Vector3.__indexToName[index]] = value;
+    },
+
+    getComponent: function(index) {
+      return this[THREE.Vector3.__indexToName[index]];
+    },
+
+    setComponent2: function(index, value) {
+      switch (index) {
+        case 0:
+          this.x = value;
+          break;
+        case 1:
+          this.y = value;
+          break;
+        case 2:
+          this.z = value;
+          break;
+        default:
+          throw new Error("index is out of range: " + index);
+      }
+    },
+
+    getComponent2: function(index) {
+      switch (index) {
+        case 0:
+          return this.x;
+        case 1:
+          return this.y;
+        case 2:
+          return this.z;
+        default:
+          throw new Error("index is out of range: " + index);
+      }
+    },
+
+
+    getComponent3: function(index) {
+      if (index === 0) return this.x;
+      if (index === 1) return this.y;
+      if (index === 2) return this.z;
+      throw new Error("index is out of range: " + index);
+    },
+
+    getComponent4: function(index) {
+      if (index === 0) return this.x;else if (index === 1) return this.y;else if (index === 2) return this.z;
+      else
+        throw new Error("index is out of range: " + index);
+    }
+  };
+
+
+  THREE.Vector3.__indexToName = {
+    0: 'x',
+    1: 'y',
+    2: 'z'
+  };
+
+  var a = [];
+  for (var i = 0; i < 100000; i++) {
+    a[i] = new THREE.Vector3(i * 0.01, i * 2, i * -1.3);
+  }
+
+
+
+
+  s.add('IndexToName', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].getComponent(i % 3);
+    }
+  });
+
+  s.add('SwitchStatement', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].getComponent2(i % 3);
+    }
+  });
+
+  s.add('IfAndReturnSeries', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].getComponent3(i % 3);
+    }
+  });
+
+  s.add('IfReturnElseSeries', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].getComponent4(i % 3);
+    }
+  });
+
+})();

+ 59 - 0
test/benchmark/core/Vector3Length.js

@@ -0,0 +1,59 @@
+(function() {
+
+  var THREE = {};
+
+  THREE.Vector3 = function(x, y, z) {
+
+    this.x = x || 0;
+    this.y = y || 0;
+    this.z = z || 0;
+
+  };
+
+  THREE.Vector3.prototype = {
+    constructor: THREE.Vector3,
+    lengthSq: function() {
+      return this.x * this.x + this.y * this.y + this.z * this.z;
+    },
+
+    length: function() {
+      return Math.sqrt(this.lengthSq());
+    },
+
+    length2: function() {
+      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
+    }
+
+  };
+
+  var a = [];
+  for (var i = 0; i < 100000; i++) {
+    a[i] = new THREE.Vector3(i * 0.01, i * 2, i * -1.3);
+  }
+
+
+  var suite = Bench.newSuite("Vector 3 Length");
+
+  suite.add('NoCallTest', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      var v = a[i];
+      result += Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
+    }
+  });
+
+  suite.add('InlineCallTest', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].length2();
+    }
+  });
+
+  suite.add('FunctionCallTest', function() {
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      result += a[i].length();
+    }
+  });
+
+})();

+ 113 - 0
test/benchmark/core/Vector3Storage.js

@@ -0,0 +1,113 @@
+(function() {
+
+  THREE = {};
+
+  THREE.Vector3 = function(x, y, z) {
+
+    this.x = x || 0;
+    this.y = y || 0;
+    this.z = z || 0;
+
+  };
+
+  THREE.Vector3.prototype = {
+
+    constructor: THREE.Vector3,
+
+    length: function() {
+
+      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
+
+    }
+
+  };
+
+  THREE.Vector3X = function(x, y, z) {
+
+    var elements = this.elements = new Float32Array(3);
+    elements[0] = x || 0;
+    elements[1] = y || 1;
+    elements[2] = z || 2;
+
+  };
+
+  THREE.Vector3X.prototype = {
+
+    constructor: THREE.Vector3X,
+
+    length: function() {
+
+      return Math.sqrt(this.elements[0] * this.elements[0] + this.elements[1] * this.elements[1] + this.elements[2] * this.elements[2]);
+
+    }
+
+  };
+
+
+  THREE.Vector3Y = function(x, y, z) {
+
+    this.elements = [x || 0, y || 1, z || 2];
+
+  };
+
+  THREE.Vector3Y.prototype = {
+
+    constructor: THREE.Vector3Y,
+
+    length: function() {
+
+      return Math.sqrt(this.elements[0] * this.elements[0] + this.elements[1] * this.elements[1] + this.elements[2] * this.elements[2]);
+
+    }
+
+  };
+
+
+  var suite = Bench.newSuite("Vector 3 Storage");
+
+  suite.add('Vector3-Set', function() {
+
+    var array = [];
+    for (var i = 0; i < 100000; i++) {
+      var v = new THREE.Vector3(i, i, i);
+      array.push(v);
+    }
+
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      var v = array[i];
+      result += v.length();
+    }
+  });
+
+  suite.add('Vector3-Float32Array', function() {
+
+    var array = [];
+    for (var i = 0; i < 100000; i++) {
+      var v = new THREE.Vector3X(i, i, i);
+      array.push(v);
+    }
+
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      var v = array[i];
+      result += v.length();
+    }
+  });
+
+  suite.add('Vector3-Array', function() {
+
+    var array = [];
+    for (var i = 0; i < 100000; i++) {
+      var v = new THREE.Vector3Y(i, i, i);
+      array.push(v);
+    }
+
+    var result = 0;
+    for (var i = 0; i < 100000; i++) {
+      var v = array[i];
+      result += v.length();
+    }
+  });
+
+})();

+ 419 - 0
test/benchmark/normalize.css

@@ -0,0 +1,419 @@
+/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */
+
+/**
+ * 1. Change the default font family in all browsers (opinionated).
+ * 2. Prevent adjustments of font size after orientation changes in IE and iOS.
+ */
+
+html {
+  font-family: sans-serif; /* 1 */
+  -ms-text-size-adjust: 100%; /* 2 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove the margin in all browsers (opinionated).
+ */
+
+body {
+  margin: 0;
+}
+
+/* HTML5 display definitions
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 9-.
+ * 1. Add the correct display in Edge, IE, and Firefox.
+ * 2. Add the correct display in IE.
+ */
+
+article,
+aside,
+details, /* 1 */
+figcaption,
+figure,
+footer,
+header,
+main, /* 2 */
+menu,
+nav,
+section,
+summary { /* 1 */
+  display: block;
+}
+
+/**
+ * Add the correct display in IE 9-.
+ */
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+}
+
+/**
+ * Add the correct display in iOS 4-7.
+ */
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+  vertical-align: baseline;
+}
+
+/**
+ * Add the correct display in IE 10-.
+ * 1. Add the correct display in IE.
+ */
+
+template, /* 1 */
+[hidden] {
+  display: none;
+}
+
+/* Links
+   ========================================================================== */
+
+/**
+ * 1. Remove the gray background on active links in IE 10.
+ * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
+ */
+
+a {
+  background-color: transparent; /* 1 */
+  -webkit-text-decoration-skip: objects; /* 2 */
+}
+
+/**
+ * Remove the outline on focused links when they are also active or hovered
+ * in all browsers (opinionated).
+ */
+
+a:active,
+a:hover {
+  outline-width: 0;
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * 1. Remove the bottom border in Firefox 39-.
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+  border-bottom: none; /* 1 */
+  text-decoration: underline; /* 2 */
+  text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
+ */
+
+b,
+strong {
+  font-weight: inherit;
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/**
+ * Add the correct font style in Android 4.3-.
+ */
+
+dfn {
+  font-style: italic;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/**
+ * Add the correct background and color in IE 9-.
+ */
+
+mark {
+  background-color: #ff0;
+  color: #000;
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10-.
+ */
+
+img {
+  border-style: none;
+}
+
+/**
+ * Hide the overflow in IE.
+ */
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct margin in IE 8.
+ */
+
+figure {
+  margin: 1em 40px;
+}
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+  box-sizing: content-box; /* 1 */
+  height: 0; /* 1 */
+  overflow: visible; /* 2 */
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * 1. Change font properties to `inherit` in all browsers (opinionated).
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+select,
+textarea {
+  font: inherit; /* 1 */
+  margin: 0; /* 2 */
+}
+
+/**
+ * Restore the font weight unset by the previous rule.
+ */
+
+optgroup {
+  font-weight: bold;
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+  overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+  text-transform: none;
+}
+
+/**
+ * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ *    controls in Android 4.
+ * 2. Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+html [type="button"], /* 1 */
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button; /* 2 */
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+  padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+  outline: 1px dotted ButtonText;
+}
+
+/**
+ * Change the border, margin, and padding in all browsers (opinionated).
+ */
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ *    `fieldset` elements in all browsers.
+ */
+
+legend {
+  box-sizing: border-box; /* 1 */
+  color: inherit; /* 2 */
+  display: table; /* 1 */
+  max-width: 100%; /* 1 */
+  padding: 0; /* 3 */
+  white-space: normal; /* 1 */
+}
+
+/**
+ * Remove the default vertical scrollbar in IE.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10-.
+ * 2. Remove the padding in IE 10-.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding and cancel buttons in Chrome and Safari on OS X.
+ */
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * Correct the text style of placeholders in Chrome, Edge, and Safari.
+ */
+
+::-webkit-input-placeholder {
+  color: inherit;
+  opacity: 0.54;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button; /* 1 */
+  font: inherit; /* 2 */
+}

+ 96 - 0
test/benchmark/style.css

@@ -0,0 +1,96 @@
+html{
+        background-color: #FFE0F7;
+}
+
+body{
+    font-family: 'Source Sans Pro', sans-serif;
+}
+
+header{
+
+}
+header h1{
+    color: #6F0752;
+    border-bottom: 4px solid #A23183;
+    margin: 10px;
+}
+
+article{
+    border: 2px solid #B8509B;
+    margin:5px 10px;
+    border-radius:10px;
+}
+
+article header{
+
+    display: flex;
+}
+
+article h2{
+    color:#6F0752;
+    font-size:1.2em;
+    margin:10px;
+    flex-grow:1;
+}
+
+article h3{
+    color:#6F0752;
+    font-size:1.0em;
+    margin:7px;
+    text-align:right;
+    flex-grow:0;
+    background:transparent;
+    border: 1px solid  #B8509B;
+    border-radius:3px;
+    padding:3px 7px;
+    cursor:pointer;
+}
+
+article h3:hover{
+    color:#6F0752;
+    font-size:1.0em;
+    margin:7px;
+    text-align:right;
+    flex-grow:0;
+    background:transparent;
+    border: 1px solid  #B8509B;
+    border-radius:3px;
+    padding:3px 7px;
+}
+
+article .results{
+    margin:0 10px 10px;
+    display:none;
+}
+article .results > div{
+    display: flex;
+}
+article .results > div p{
+    color:#6F0752;
+    flex-grow: 1;
+    margin: 0 3px;
+    font-size:0.8em;
+}
+
+.results > div:nth-child(1){
+    margin-bottom: 3px;
+    border-bottom: 1px solid #A23183;
+}
+
+.results > div:nth-child(2){
+    background: #6F0752;
+}
+
+.results > div:nth-child(2) p{
+    color: #FFE0F7;
+}
+
+.results .name{
+    flex-basis:60%;
+}
+.results .time{
+    flex-basis:20%;
+}
+.results .desv{
+    flex-basis:20%;
+}

File diff suppressed because it is too large
+ 0 - 0
test/benchmark/vendor/benchmark-2.1.0.min.js


File diff suppressed because it is too large
+ 121 - 0
test/benchmark/vendor/lodash.min.js


Some files were not shown because too many files changed in this diff