提交 ef57b34b 编写于 作者: B Brian 提交者: Mr.doob

Benchmarks Suite Added (#8999)

* Upgrading BenchmarkJS to major version 2

* Added Benchmarks page

* Updated old Vector3Components Benchmark

* Real order

* Float32 Array Benchs Added

* Vector 3 Length Bench Added

* Vector 3 Storage Bench Added

* Deleted old benchmark pages

* Added some functionality

* Added Doc
上级 7e0a836e
# 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`
此差异已折叠。
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();
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThreeJS Benchmark Tests - Using Files in /src</title>
</head>
<body>
During this Benchmarking test the browser will be unresponsive.<br/><br/>
Benchmark output is written to the JavaScript console. To access the JavaScript console presss Ctrl-Shift-J.
<script src="benchmark-1.0.0.js"></script>
<!-- add ThreeJS sources to test below -->
<script src="../../src/Three.js"></script>
<script src="../../src/math/Vector2.js"></script>
<script src="../../src/math/Vector3.js"></script>
<script src="../../src/math/Vector4.js"></script>
<script src="../../src/math/Box2.js"></script>
<script src="../../src/math/Box3.js"></script>
<script src="../../src/math/Plane.js"></script>
<script src="../../src/math/Ray.js"></script>
<script src="../../src/math/Sphere.js"></script>
<script src="../../src/math/Triangle.js"></script>
<script src="../../src/math/Matrix3.js"></script>
<script src="../../src/math/Matrix4.js"></script>
<script src="../../src/math/Color.js"></script>
<!-- add class-based unit tests below -->
<script src="core/Float32Array.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThreeJS Benchmark Tests - Using Files in /src</title>
</head>
<body>
During this Benchmarking test the browser will be unresponsive.<br/><br/>
Benchmark output is written to the JavaScript console. To access the JavaScript console presss Ctrl-Shift-J.
<script src="benchmark-1.0.0.js"></script>
<!-- add class-based unit tests below -->
<script src="core/Vector3Components.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThreeJS Benchmark Tests - Using Files in /src</title>
</head>
<body>
During this Benchmarking test the browser will be unresponsive.<br/><br/>
Benchmark output is written to the JavaScript console. To access the JavaScript console presss Ctrl-Shift-J.
<script src="benchmark-1.0.0.js"></script>
<!-- add class-based unit tests below -->
<script src="core/Vector3Length.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThreeJS Benchmark Tests - Using Files in /src</title>
</head>
<body>
During this Benchmarking test the browser will be unresponsive.<br/><br/>
Benchmark output is written to the JavaScript console. To access the JavaScript console presss Ctrl-Shift-J.
<script src="benchmark-1.0.0.js"></script>
<!-- add class-based unit tests below -->
<script src="core/Vector3Storage.js"></script>
</body>
</html>
\ No newline at end of file
<!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>
(function() {
var input = new Float32Array( 10000 * 3 );
var output = new Float32Array( 10000 * 3 );
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;
}
for (var j = 0, jl = input.length; j < jl; j++) {
input[j] = j;
}
var inputVectors = [];
var outputVectors = [];
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() );
}
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 suite = new Benchmark.Suite;
var s = Bench.newSuite("Float 32 Arrays");
suite.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-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];
}
});
suite.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-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];
}
});
suite.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-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;
}
});
suite.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;
}
});
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;
}
});
suite.add('Vector3Array-Direct', function() {
for (var i = 0, il = inputVectors.length; i < il; i ++ ) {
outputVectors[i].copy( inputVectors[i] );
outputVectors[i].x *= 1.01;
outputVectors[i].y *= 1.03;
outputVectors[i].z *= 0.98;
}
});
suite.add('Vector3Array-Vector3', function() {
var value = new THREE.Vector3();
for (var i = 0, il = inputVectors.length; i < il; i ++ ) {
value.copy( inputVectors[i] );
value.x *= 1.01;
value.y *= 1.03;
value.z *= 0.98;
outputVectors[i].copy( value );
}
});
suite.on('cycle', function(event, bench) {
console.log(String(event.target));
});
suite.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
console.log( "Done" );
});
suite.run(true);
\ No newline at end of file
})();
THREE = {};
THREE.Vector3 = function ( x, y, z ) {
(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 = {
THREE.Vector3.prototype = {
constructor: THREE.Vector3,
setComponent: function ( index, value ) {
this[ THREE.Vector3.__indexToName[ index ] ] = value;
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 );
}
getComponent: function(index) {
return this[THREE.Vector3.__indexToName[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 );
}
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);
}
},
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 );
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);
}
},
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 );
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 = [];
THREE.Vector3.__indexToName = {
0: 'x',
1: 'y',
2: 'z'
};
for ( var i = 0; i < 100000; i ++ ) {
a[ i ] = new THREE.Vector3( i * 0.01, i * 2, i * -1.3 );
}
var a = [];
for (var i = 0; i < 100000; i++) {
a[i] = new THREE.Vector3(i * 0.01, i * 2, i * -1.3);
}
var suite = new Benchmark.Suite;
suite.add('IndexToName', function() {
s.add('IndexToName', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[i].getComponent( i % 3 );
for (var i = 0; i < 100000; i++) {
result += a[i].getComponent(i % 3);
}
});
});
suite.add('SwitchStatement', function() {
s.add('SwitchStatement', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[i].getComponent2( i % 3 );
for (var i = 0; i < 100000; i++) {
result += a[i].getComponent2(i % 3);
}
});
});
suite.add('IfAndReturnSeries', function() {
s.add('IfAndReturnSeries', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[i].getComponent3( i % 3 );
for (var i = 0; i < 100000; i++) {
result += a[i].getComponent3(i % 3);
}
});
});
suite.add('IfReturnElseSeries', function() {
s.add('IfReturnElseSeries', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[i].getComponent4( i % 3 );
for (var i = 0; i < 100000; i++) {
result += a[i].getComponent4(i % 3);
}
});
});
suite.on('cycle', function(event, bench) {
console.log(String(event.target));
});
suite.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
console.log( "Done" );
});
suite.run(true);
\ No newline at end of file
})();
THREE = {};
THREE.Vector3 = function ( x, y, z ) {
(function() {
var THREE = {};
THREE.Vector3 = function(x, y, z) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
};
THREE.Vector3.prototype = {
};
THREE.Vector3.prototype = {
constructor: THREE.Vector3,
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z;
lengthSq: function() {
return this.x * this.x + this.y * this.y + this.z * this.z;
},
length: function () {
return Math.sqrt( this.lengthSq() );
length: function() {
return Math.sqrt(this.lengthSq());
},
length2: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
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 a = [];
for (var i = 0; i < 100000; i++) {
a[i] = new THREE.Vector3(i * 0.01, i * 2, i * -1.3);
}
var suite = new Benchmark.Suite;
suite.add('NoCallTest', function() {
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 );
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() {
suite.add('InlineCallTest', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[ i ].length2();
for (var i = 0; i < 100000; i++) {
result += a[i].length2();
}
});
});
suite.add('FunctionCallTest', function() {
suite.add('FunctionCallTest', function() {
var result = 0;
for ( var i = 0; i < 100000; i ++ ) {
result += a[ i ].length();
for (var i = 0; i < 100000; i++) {
result += a[i].length();
}
});
suite.on('cycle', function(event, bench) {
console.log(String(event.target));
});
suite.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
console.log( "Done" );
});
});
suite.run(true);
\ No newline at end of file
})();
THREE = {};
THREE.Vector3 = function ( x, y, z ) {
(function() {
THREE = {};
THREE.Vector3 = function(x, y, z) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
};
};
THREE.Vector3.prototype = {
THREE.Vector3.prototype = {
constructor: THREE.Vector3,
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
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 );
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 = {
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] );
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 = function(x, y, z) {
};
this.elements = [x || 0, y || 1, z || 2];
THREE.Vector3Y.prototype = {
};
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] );
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 = new Benchmark.Suite;
var suite = Bench.newSuite("Vector 3 Storage");
suite.add('Vector3-Set', function() {
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 );
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();
for (var i = 0; i < 100000; i++) {
var v = array[i];
result += v.length();
}
});
});
suite.add('Vector3-Float32Array', function() {
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 );
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();
for (var i = 0; i < 100000; i++) {
var v = array[i];
result += v.length();
}
});
});
suite.add('Vector3-Array', function() {
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 );
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();
for (var i = 0; i < 100000; i++) {
var v = array[i];
result += v.length();
}
});
suite.on('cycle', function(event, bench) {
console.log(String(event.target));
});
suite.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
console.log( "Done" );
});
});
suite.run(true);
\ No newline at end of file
})();
此差异已折叠。
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%;
}
(function(){"use strict";function e(t){function s(e,n,t){var r=this;return r instanceof s?(Y.isPlainObject(e)?t=e:Y.isFunction(e)?(t=n,n=e):Y.isPlainObject(n)?(t=n,n=null,r.name=e):r.name=e,_(r,t),r.id||(r.id=++c),null==r.fn&&(r.fn=n),r.stats=ke(r.stats),void(r.times=ke(r.times))):new s(e,n,t)}function a(e){var n=this;return n instanceof a?(n.benchmark=e,void Q(n)):new a(e)}function l(e){var n=this;return e instanceof l?e:n instanceof l?Y.assign(n,{timeStamp:Y.now()},"string"==typeof e?{type:e}:e):new l(e)}function y(e,n){var t=this;return t instanceof y?(Y.isPlainObject(e)?n=e:t.name=e,void _(t,n)):new y(e,n)}function v(){return v=function(e,n){var t,r=o?o.amd:s,i=$e+"createFunction";return k((o?"define.amd.":"Benchmark.")+i+"=function("+e+"){"+n+"}"),t=r[i],delete r[i],t},v=Ce.browser&&(v("",'return"'+$e+'"')||Y.noop)()==$e?v:ne,v.apply(null,arguments)}function b(e,n){e._timerId=Y.delay(n,1e3*e.delay)}function w(e){Se.appendChild(e),Se.innerHTML=""}function T(e){return!Y.has(e,"toString")&&(/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(e)||0)[1]||""}function S(e){return Y.reduce(e,function(e,n){return e+n})/e.length||0}function $(e){var n="";return C(e)?n=oe(e):Ce.decompilation&&(n=Y.result(/^[^{]+\{([\s\S]*)\}\s*$/.exec(e),1)),n=(n||"").replace(/^\s+|\s+$/g,""),/^(?:\/\*+[\w\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test(n)?"":n}function x(e,n){if(null==e)return!1;var t=typeof e[n];return!(f.test(t)||"object"==t&&!e[n])}function C(e){return Y.isString(e)||Y.has(e,"toString")&&Y.isFunction(e.toString)}function j(e){try{var n=i&&u(e)}catch(t){}return n||null}function k(e){var n=o?define.amd:s,t=be.createElement("script"),r=be.getElementsByTagName("script")[0],i=r.parentNode,a=$e+"runScript",u="("+(o?"define.amd.":"Benchmark.")+a+"||function(){})();";try{t.appendChild(be.createTextNode(u+e)),n[a]=function(){w(t)}}catch(c){i=i.cloneNode(!1),r=null,t.text=e}i.insertBefore(t,r),delete n[a]}function _(e,n){n=e.options=Y.assign({},ke(e.constructor.options),ke(n)),Y.forOwn(n,function(n,t){null!=n&&(/^on[A-Z]/.test(t)?Y.each(t.split(" "),function(t){e.on(t.slice(2).toLowerCase(),n)}):Y.has(e,t)||(e[t]=ke(n)))})}function O(){var e=this,n=e.benchmark,r=n._original;r.aborted?(e.teardown(),n.running=!1,V(e)):++e.cycles<n.count?n.compiled.call(e,t,je):(je.stop(e),e.teardown(),b(n,function(){V(e)}))}function A(e,n){if("successful"===n)n=function(e){return e.cycles&&Y.isFinite(e.hz)&&!e.error};else if("fastest"===n||"slowest"===n){var t=A(e,"successful").sort(function(e,t){return e=e.stats,t=t.stats,(e.mean+e.moe>t.mean+t.moe?1:-1)*("fastest"===n?1:-1)});return Y.filter(t,function(e){return 0==t[0].compare(e)})}return Y.filter(e,n)}function E(e){return e=oe(e).split("."),e[0].replace(/(?=(?:\d{3})+$)(?!\b)/g,",")+(e[1]?"."+e[1]:"")}function F(e,t){function r(){var e,r=i(c);return r&&(c.on("complete",o),e=c.events.complete,e.splice(0,0,e.pop())),h[p]=Y.isFunction(c&&c[t])?c[t].apply(c,u):n,!r&&o()}function o(n){var t,s=c,u=i(s);if(u&&(s.off("complete",o),s.emit("complete")),m.type="cycle",m.target=s,t=l(m),d.onCycle.call(e,t),t.aborted||a()===!1)m.type="complete",d.onComplete.call(e,l(m));else if(c=f?e[0]:h[p],i(c))b(c,r);else{if(!u)return!0;for(;r(););}return n?void(n.aborted=!0):!1}function i(e){var n=u[0]&&u[0].async;return"run"==t&&e instanceof s&&((null==n?e.options.async:n)&&Ce.timeout||e.defer)}function a(){return p++,f&&p>0&&de.call(e),(f?e.length:p<h.length)?p:p=!1}var u,c,f,p=-1,m={currentTarget:e},d={onStart:Y.noop,onCycle:Y.noop,onComplete:Y.noop},h=Y.toArray(e);if(Y.isString(t)?u=he.call(arguments,2):(d=Y.assign(d,t),t=d.name,u=Y.isArray(u="args"in d?d.args:[])?u:[u],f=d.queued),a()!==!1)if(c=h[p],m.type="start",m.target=c,d.onStart.call(e,l(m)),"run"==t&&e instanceof y&&e.aborted)m.type="cycle",d.onCycle.call(e,l(m)),m.type="complete",d.onComplete.call(e,l(m));else if(i(c))b(c,r);else for(;r(););return h}function B(e,n,t){var r=[],o=(e=re(e)).length,i=o===o>>>0;return t||(t=": "),Y.each(e,function(e,n){r.push(i?e:n+t+e)}),r.join(n||",")}function z(){var e,n=this,t=xe.resetSuite;return n.running&&(e=l("abort"),n.emit(e),(!e.cancelled||t)&&(xe.abortSuite=!0,n.reset(),delete xe.abortSuite,t||(n.aborted=!0,F(n,"abort")))),n}function q(e,n,t){var r=this,o=new s(e,n,t),i=l({type:"add",target:o});return r.emit(i),i.cancelled||r.push(o),r}function N(e){var n=this,t=new n.constructor(Y.assign({},n.options,e));return Y.forOwn(n,function(e,n){Y.has(t,n)||(t[n]=e&&Y.isFunction(e.clone)?e.clone():ke(e))}),t}function I(e){var n=this,t=new n.constructor(n.options);return t.push.apply(t,A(n,e)),t}function D(){var e,n=this,t=xe.abortSuite;return n.running&&!t?(xe.resetSuite=!0,n.abort(),delete xe.resetSuite):!n.aborted&&!n.running||(n.emit(e=l("reset")),e.cancelled)||(n.aborted=n.running=!1,t||F(n,"reset")),n}function P(e){var n=this;return n.reset(),n.running=!0,e||(e={}),F(n,{name:"run",args:e,queued:e.queued,onStart:function(e){n.emit(e)},onCycle:function(e){var t=e.target;t.error&&n.emit({type:"error",target:t}),n.emit(e),e.aborted=n.aborted},onComplete:function(e){n.running=!1,n.emit(e)}}),n}function M(e){var n,t=this,r=l(e),o=t.events,i=(arguments[0]=r,arguments);return r.currentTarget||(r.currentTarget=t),r.target||(r.target=t),delete r.result,o&&(n=Y.has(o,r.type)&&o[r.type])&&Y.each(n.slice(),function(e){return(r.result=e.apply(t,i))===!1&&(r.cancelled=!0),!r.aborted}),r.result}function R(e){var n=this,t=n.events||(n.events={});return Y.has(t,e)?t[e]:t[e]=[]}function L(e,n){var t=this,r=t.events;return r?(Y.each(e?e.split(" "):r,function(e,t){var o;"string"==typeof e&&(t=e,e=Y.has(r,t)&&r[t]),e&&(n?(o=Y.indexOf(e,n),o>-1&&e.splice(o,1)):e.length=0)}),t):t}function W(e,n){var t=this,r=t.events||(t.events={});return Y.each(e.split(" "),function(e){(Y.has(r,e)?r[e]:r[e]=[]).push(n)}),t}function H(){var e,n=this,t=xe.reset;return n.running&&(e=l("abort"),n.emit(e),(!e.cancelled||t)&&(xe.abort=!0,n.reset(),delete xe.abort,Ce.timeout&&(ue(n._timerId),delete n._timerId),t||(n.aborted=!0,n.running=!1))),n}function Z(e){var n=this,t=new n.constructor(Y.assign({},n,e));return t.options=Y.assign({},ke(n.options),ke(e)),Y.forOwn(n,function(e,n){Y.has(t,n)||(t[n]=ke(e))}),t}function G(e){function n(e,n){return Y.reduce(n,function(n,t){return n+(t>e?0:e>t?1:.5)},0)}function t(e,t){return Y.reduce(e,function(e,r){return e+n(r,t)},0)}function r(e){return(e-c*l/2)/ge(c*l*(c+l+1)/12)}var o=this;if(o==e)return 0;var i,s,a=o.stats.sample,u=e.stats.sample,c=a.length,l=u.length,f=le(c,l),p=fe(c,l),m=t(a,u),d=t(u,a),h=fe(m,d);return c+l>30?(s=r(h),ae(s)>1.96?h==m?1:-1:0):(i=5>f||3>p?0:g[f][p-3],i>=h?h==m?1:-1:0)}function J(){var e=this;if(e.running&&!xe.abort)return xe.reset=!0,e.abort(),delete xe.reset,e;var n,t=0,r=[],o=[],i={destination:e,source:Y.assign({},ke(e.constructor.prototype),ke(e.options))};do Y.forOwn(i.source,function(e,n){var t,s=i.destination,a=s[n];"_"!=n.charAt(0)&&(e&&"object"==typeof e?(Y.isArray(e)?(Y.isArray(a)||(t=a=[]),a.length!=e.length&&(t=a=a.slice(0,e.length),a.length=e.length)):a&&"object"==typeof a||(t=a={}),t&&r.push({destination:s,key:n,value:a}),o.push({destination:a,source:e})):e===a||null==e||Y.isFunction(e)||r.push({destination:s,key:n,value:e}))});while(i=o[t++]);return r.length&&(e.emit(n=l("reset")),!n.cancelled)&&Y.each(r,function(e){e.destination[e.key]=e.value}),e}function K(){var e=this,n=e.error,t=e.hz,r=e.id,o=e.stats,i=o.sample.length,s="±",a=e.name||(Y.isNaN(r)?r:"<Test #"+r+">");return a+=n?": "+B(n):" x "+E(t.toFixed(100>t?2:0))+" ops/sec "+s+o.rme.toFixed(2)+"% ("+i+" run"+(1==i?"":"s")+" sampled)"}function Q(){function e(e,n,t,o){var s=e.fn,a=t?T(s)||"deferred":"";return i.uid=$e+p++,Y.assign(i,{setup:n?$(e.setup):r("m#.setup()"),fn:n?$(s):r("m#.fn("+a+")"),fnArg:a,teardown:n?$(e.teardown):r("m#.teardown()")}),"ns"==je.unit?Y.assign(i,{begin:r("s#=n#()"),end:r("r#=n#(s#);r#=r#[0]+(r#[1]/1e9)")}):"us"==je.unit?je.ns.stop?Y.assign(i,{begin:r("s#=n#.start()"),end:r("r#=n#.microseconds()/1e6")}):Y.assign(i,{begin:r("s#=n#()"),end:r("r#=(n#()-s#)/1e6")}):je.ns.now?Y.assign(i,{begin:r("s#=n#.now()"),end:r("r#=(n#.now()-s#)/1e3")}):Y.assign(i,{begin:r("s#=new n#().getTime()"),end:r("r#=(new n#().getTime()-s#)/1e3")}),je.start=v(r("o#"),r("var n#=this.ns,${begin};o#.elapsed=0;o#.timeStamp=s#")),je.stop=v(r("o#"),r("var n#=this.ns,s#=o#.timeStamp,${end};o#.elapsed=r#")),v(r("window,t#"),"var global = window, clearTimeout = global.clearTimeout, setTimeout = global.setTimeout;\n"+r(o))}function n(e){for(var n,t,r=30,o=1e3,i=je.ns,s=[];r--;){if("us"==e)if(o=1e6,i.stop)for(i.start();!(n=i.microseconds()););else for(t=i();!(n=i()-t););else if("ns"==e){for(o=1e9,t=(t=i())[0]+t[1]/o;!(n=(n=i())[0]+n[1]/o-t););o=1}else if(i.now)for(t=i.now();!(n=i.now()-t););else for(t=(new i).getTime();!(n=(new i).getTime()-t););if(!(n>0)){s.push(1/0);break}s.push(n)}return S(s)/o}function r(e){return Y.template(e.replace(/\#/g,/\d+/.exec(i.uid)))(i)}var o=s.options,i={},u=[{ns:je.ns,res:le(.0015,n("ms")),unit:"ms"}];Q=function(n){var r;n instanceof a&&(r=n,n=r.benchmark);var s=n._original,u=C(s.fn),c=s.count=n.count,l=u||Ce.decompilation&&(n.setup!==Y.noop||n.teardown!==Y.noop),f=s.id,p=s.name||("number"==typeof f?"<Test #"+f+">":f),m=0;n.minTime=s.minTime||(s.minTime=s.options.minTime=o.minTime);var d=r?'var d#=this,${fnArg}=d#,m#=d#.benchmark._original,f#=m#.fn,su#=m#.setup,td#=m#.teardown;if(!d#.cycles){d#.fn=function(){var ${fnArg}=d#;if(typeof f#=="function"){try{${fn}\n}catch(e#){f#(d#)}}else{${fn}\n}};d#.teardown=function(){d#.cycles=0;if(typeof td#=="function"){try{${teardown}\n}catch(e#){td#()}}else{${teardown}\n}};if(typeof su#=="function"){try{${setup}\n}catch(e#){su#()}}else{${setup}\n};t#.start(d#);}d#.fn();return{uid:"${uid}"}':'var r#,s#,m#=this,f#=m#.fn,i#=m#.count,n#=t#.ns;${setup}\n${begin};while(i#--){${fn}\n}${end};${teardown}\nreturn{elapsed:r#,uid:"${uid}"}',h=s.compiled=n.compiled=e(s,l,r,d),g=!(i.fn||u);try{if(g)throw new Error('The test "'+p+'" is empty. This may be the result of dead code removal.');r||(s.count=1,h=l&&(h.call(s,t,je)||{}).uid==i.uid&&h,s.count=c)}catch(y){h=null,n.error=y||new Error(oe(y)),s.count=c}if(!h&&!r&&!g){d=(u||l&&!n.error?"function f#(){${fn}\n}var r#,s#,m#=this,i#=m#.count":"var r#,s#,m#=this,f#=m#.fn,i#=m#.count")+",n#=t#.ns;${setup}\n${begin};m#.f#=f#;while(i#--){m#.f#()}${end};delete m#.f#;${teardown}\nreturn{elapsed:r#}",h=e(s,l,r,d);try{s.count=1,h.call(s,t,je),s.count=c,delete n.error}catch(y){s.count=c,n.error||(n.error=y||new Error(oe(y)))}}return n.error||(h=s.compiled=n.compiled=e(s,l,r,d),m=h.call(r||s,t,je).elapsed),m};try{(je.ns=new(t.chrome||t.chromium).Interval)&&u.push({ns:je.ns,res:n("us"),unit:"us"})}catch(c){}if(Te&&"function"==typeof(je.ns=Te.hrtime)&&u.push({ns:je.ns,res:n("ns"),unit:"ns"}),we&&"function"==typeof(je.ns=we.now)&&u.push({ns:je.ns,res:n("us"),unit:"us"}),je=Y.minBy(u,"res"),je.res==1/0)throw new Error("Benchmark.js was unable to find a working timer.");return o.minTime||(o.minTime=le(je.res/2/.01,.05)),Q.apply(null,arguments)}function U(e,n){function t(){c.push(e.clone({_original:e,events:{abort:[r],cycle:[r],error:[r],start:[r]}}))}function r(n){var t=this,r=n.type;e.running?"start"==r?t.count=e.initCount:("error"==r&&(e.error=t.error),"abort"==r?(e.abort(),e.emit("cycle")):(n.currentTarget=n.target=e,e.emit(n))):e.aborted&&(t.events.abort.length=0,t.abort())}function o(n){var r,o,i,f,p,m,d,g,y=n.target,v=e.aborted,b=Y.now(),w=l.push(y.times.period),T=w>=u&&(s+=b-y.times.timeStamp)/1e3>e.maxTime,$=e.times,x=function(e,n){return e+pe(n-i,2)};(v||y.hz==1/0)&&(T=!(w=l.length=c.length=0)),v||(i=S(l),g=Y.reduce(l,x,0)/(w-1)||0,m=ge(g),d=m/ge(w),o=w-1,r=h[te.round(o)||1]||h.infinity,f=d*r,p=f/i*100||0,Y.assign(e.stats,{deviation:m,mean:i,moe:f,rme:p,sem:d,variance:g}),T&&(e.initCount=a,e.running=!1,v=!0,$.elapsed=(b-$.timeStamp)/1e3),e.hz!=1/0&&(e.hz=1/i,$.cycle=i*e.count,$.period=i)),c.length<2&&!T&&t(),n.aborted=v}n||(n={});var i=n.async,s=0,a=e.initCount,u=e.minSamples,c=[],l=e.stats.sample;t(),F(c,{name:"run",args:{async:i},queued:!0,onCycle:o,onComplete:function(){e.emit("complete")}})}function V(e,n){n||(n={});var r;e instanceof a&&(r=e,e=e.benchmark);var o,i,s,u,c,f,p=n.async,m=e._original,h=e.count,g=e.times;e.running&&(i=++e.cycles,o=r?r.elapsed:Q(e),c=e.minTime,i>m.cycles&&(m.cycles=i),e.error&&(u=l("error"),u.message=e.error,e.emit(u),u.cancelled||e.abort())),e.running&&(m.times.cycle=g.cycle=o,f=m.times.period=g.period=o/h,m.hz=e.hz=1/f,m.initCount=e.initCount=h,e.running=c>o,e.running&&(o||null==(s=d[e.cycles])||(h=ce(4e6/s)),h<=e.count&&(h+=te.ceil((c-o)/f)),e.running=h!=1/0)),u=l("cycle"),e.emit(u),u.aborted&&e.abort(),e.running?(e.count=h,r?e.compiled.call(r,t,je):p?b(e,function(){V(e,n)}):V(e)):(Ce.browser&&k($e+"=1;delete "+$e),e.emit("complete"))}function X(e){var n=this,t=l("start");return n.running=!1,n.reset(),n.running=!0,n.count=n.initCount,n.times.timeStamp=Y.now(),n.emit(t),t.cancelled||(e={async:(null==(e=e&&e.async)?n.async:e)&&Ce.timeout},n._original?n.defer?a(n):V(n,e):U(n,e)),n}var Y=t&&t._||j("lodash")||r._;if(!Y)return s.runInContext=e,s;t=t?Y.defaults(r.Object(),t,Y.pick(r,m)):r;var ee=(t.Array,t.Date),ne=t.Function,te=t.Math,re=t.Object,oe=(t.RegExp,t.String),ie=[],se=re.prototype,ae=te.abs,ue=t.clearTimeout,ce=te.floor,le=(te.log,te.max),fe=te.min,pe=te.pow,me=ie.push,de=(t.setTimeout,ie.shift),he=ie.slice,ge=te.sqrt,ye=(se.toString,ie.unshift),ve=j,be=x(t,"document")&&t.document,we=ve("microtime"),Te=x(t,"process")&&t.process,Se=be&&be.createElement("div"),$e="uid"+Y.now(),xe={},Ce={};!function(){Ce.browser=be&&x(t,"navigator")&&!x(t,"phantom"),Ce.timeout=x(t,"setTimeout")&&x(t,"clearTimeout");try{Ce.decompilation="1"===ne(("return ("+function(e){return{x:""+(1+e),y:0}}+")").replace(/__cov__[^;]+;/g,""))()(0).x}catch(e){Ce.decompilation=!1}}();var je={ns:ee,start:null,stop:null},ke=Y.partial(Y.cloneDeepWith,Y,function(e){return!Y.isObject(e)||Y.isArray(e)||Y.isPlainObject(e)?n:e});return Y.assign(s,{options:{async:!1,defer:!1,delay:.005,id:n,initCount:1,maxTime:5,minSamples:5,minTime:0,name:n,onAbort:n,onComplete:n,onCycle:n,onError:n,onReset:n,onStart:n},platform:t.platform||j("platform")||{description:t.navigator&&t.navigator.userAgent||null,layout:null,product:null,name:null,manufacturer:null,os:null,prerelease:null,version:null,toString:function(){return this.description||""}},version:"2.1.0"}),Y.assign(s,{filter:A,formatNumber:E,invoke:F,join:B,runInContext:e,support:Ce}),Y.each(["each","forEach","forOwn","has","indexOf","map","reduce"],function(e){s[e]=Y[e]}),Y.assign(s.prototype,{count:0,cycles:0,hz:0,compiled:n,error:n,fn:n,aborted:!1,running:!1,setup:Y.noop,teardown:Y.noop,stats:{moe:0,rme:0,sem:0,deviation:0,mean:0,sample:[],variance:0},times:{cycle:0,elapsed:0,period:0,timeStamp:0}}),Y.assign(s.prototype,{abort:H,clone:Z,compare:G,emit:M,listeners:R,off:L,on:W,reset:J,run:X,toString:K}),Y.assign(a.prototype,{benchmark:null,cycles:0,elapsed:0,timeStamp:0}),Y.assign(a.prototype,{resolve:O}),Y.assign(l.prototype,{aborted:!1,cancelled:!1,currentTarget:n,result:n,target:n,timeStamp:0,type:""}),y.options={name:n},Y.assign(y.prototype,{length:0,aborted:!1,running:!1}),Y.assign(y.prototype,{abort:z,add:q,clone:N,emit:M,filter:I,join:ie.join,listeners:R,off:L,on:W,pop:ie.pop,push:me,reset:D,run:P,reverse:ie.reverse,shift:de,slice:he,sort:ie.sort,splice:ie.splice,unshift:ye}),Y.assign(s,{Deferred:a,Event:l,Suite:y}),Y.each(["each","forEach","indexOf","map","reduce"],function(e){var n=Y[e];y.prototype[e]=function(){var e=[this];return me.apply(e,arguments),n.apply(Y,e)}}),Y.each(["pop","shift","splice"],function(e){var n=ie[e];y.prototype[e]=function(){var e=this,t=n.apply(e,arguments);return 0===e.length&&delete e[0],t}}),y.prototype.unshift=function(){var e=this;return ye.apply(e,arguments),e.length},s}var n,t={"function":!0,object:!0},r=t[typeof window]&&window||this,o="function"==typeof define&&"object"==typeof define.amd&&define.amd&&define,i=t[typeof exports]&&exports&&!exports.nodeType&&exports,s=t[typeof module]&&module&&!module.nodeType&&module,a=i&&s&&"object"==typeof global&&global;!a||a.global!==a&&a.window!==a&&a.self!==a||(r=a);var u="function"==typeof require&&require,c=0,l=s&&s.exports===i&&i,f=/^(?:boolean|number|string|undefined)$/,p=0,m=["Array","Date","Function","Math","Object","RegExp","String","_","clearTimeout","chrome","chromium","document","navigator","phantom","platform","process","runtime","setTimeout"],d={1:4096,2:512,3:64,4:8,5:0},h={1:12.706,2:4.303,3:3.182,4:2.776,5:2.571,6:2.447,7:2.365,8:2.306,9:2.262,10:2.228,11:2.201,12:2.179,13:2.16,14:2.145,15:2.131,16:2.12,17:2.11,18:2.101,19:2.093,20:2.086,21:2.08,22:2.074,23:2.069,24:2.064,25:2.06,26:2.056,27:2.052,28:2.048,29:2.045,30:2.042,infinity:1.96},g={5:[0,1,2],6:[1,2,3,5],7:[1,3,5,6,8],8:[2,4,6,8,10,13],9:[2,4,7,10,12,15,17],10:[3,5,8,11,14,17,20,23],11:[3,6,9,13,16,19,23,26,30],12:[4,7,11,14,18,22,26,29,33,37],13:[4,8,12,16,20,24,28,33,37,41,45],14:[5,9,13,17,22,26,31,36,40,45,50,55],15:[5,10,14,19,24,29,34,39,44,49,54,59,64],16:[6,11,15,21,26,31,37,42,47,53,59,64,70,75],17:[6,11,17,22,28,34,39,45,51,57,63,67,75,81,87],18:[7,12,18,24,30,36,42,48,55,61,67,74,80,86,93,99],19:[7,13,19,25,32,38,45,52,58,65,72,78,85,92,99,106,113],20:[8,14,20,27,34,41,48,55,62,69,76,83,90,98,105,112,119,127],21:[8,15,22,29,36,43,50,58,65,73,80,88,96,103,111,119,126,134,142],22:[9,16,23,30,38,45,53,61,69,77,85,93,101,109,117,125,133,141,150,158],23:[9,17,24,32,40,48,56,64,73,81,89,98,106,115,123,132,140,149,157,166,175],24:[10,17,25,33,42,50,59,67,76,85,94,102,111,120,129,138,147,156,165,174,183,192],25:[10,18,27,35,44,53,62,71,80,89,98,107,117,126,135,145,154,163,173,182,192,201,211],26:[11,19,28,37,46,55,64,74,83,93,102,112,122,132,141,151,161,171,181,191,200,210,220,230],27:[11,20,29,38,48,57,67,77,87,97,107,118,125,138,147,158,168,178,188,199,209,219,230,240,250],28:[12,21,30,40,50,60,70,80,90,101,111,122,132,143,154,164,175,186,196,207,218,228,239,250,261,272],29:[13,22,32,42,52,62,73,83,94,105,116,127,138,149,160,171,182,193,204,215,226,238,249,260,271,282,294],30:[13,23,33,43,54,65,76,87,98,109,120,131,143,154,166,177,189,200,212,223,235,247,258,270,282,293,305,317]};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define(["lodash","platform"],function(n,t){return e({_:n,platform:t})});else{var y=e();i&&s?(l&&((s.exports=y).Benchmark=y),i.Benchmark=y):r.Benchmark=y}}).call(this);
\ No newline at end of file
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册