//// Created by Seiji Emery on 9/4/15// Copyright 2015 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//// Checks various types of js iteration (for loops, for/in loops, Array.forEach, and Object.keys)// for speed + efficiency. Mostly a sanity check for my own code.// Script.include("perfTest.js"); (function () { var input1 = []; var input2 = []; var N = 1000; for (var i = 0; i < N; ++i) { input1.push(Math.random()); input2.push(Math.random()); } TestCase.prototype.withArray = function(n, func) { this.before(function () { this.array = []; for (var i = 0; i < n; ++i) { this.array.push(0); } }); this.run(fcn); } print("For loop test -- prelim tests"); var prelimTests = new TestRunner(); prelimTests.addTestCase('Array.push (test component)') .before(function () { this.array = []; }) .run(function () { this.array.push(1); }); prelimTests.addTestCase('Array.push with mul op (test component)') .before(function() { this.array = []; }) .run(function (i) { this.array.push(input1[i] * Math.PI); }) prelimTests.runAllTestsWithIterations([1e4, 1e5, 1e6], 1e6, 10); print("For loop test (n = " + N + ")"); var loopTests = new TestRunner(); loopTests.addTestCase('for (var i = 0; i < n; ++i) { ... }') .before(function () { this.array = []; }) .run(function () { for (var i = 0; i < N; ++i) { this.array.push(input1[i] * Math.PI); } }) loopTests.addTestCase('while (n --> 0) { ... } (reversed)') .before(function () { this.array = []; }) .run(function () { var n = N; while (n --> 0) { this.array.push(input1[n] * Math.PI); } }) loopTests.addTestCase('Array.forEach(function(v, i) { ... })') .before(function () { this.array = []; }) .run(function () { input1.forEach(function(v) { this.array.push(v * Math.PI); }, this); }) loopTests.addTestCase('Array.map(function(v, i) { ... })') .run(function () { this.array = input1.map(function (v) { return v * Math.PI; }, this); }); loopTests.runAllTestsWithIterations([10, 100, 1000], 1e3, 10); // Test iteration on object keys // http://stackoverflow.com/questions/10726909/random-alpha-numeric-string-in-javascript function makeRandomString(length, chars) { var result = ''; for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))]; return result; } function randomString () { var n = Math.floor(Math.random() * 18) + 12; return makeRandomString(n, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); } var obj = {}, numKeys = 1000; while (numKeys --> 0) { obj[randomString()] = Math.floor(Math.random() * 255); } print("Object iter tests (object has " + Object.keys(obj).length + " keys)"); var iterTests = new TestRunner(); iterTests.addTestCase('for (var k in obj) { foo(obj[k]); }') .before(function () { this.x = 0; }) .run(function () { for (var k in obj) { this.x = (this.x + obj[k]) % 256; } }); iterTests.addTestCase('for (var k in obj) { if (Object.hasOwnProperty(obj, k)) { foo(obj[k]); } }') .before(function () { this.x = 0; }) .run(function () { for (var k in obj) { if (Object.hasOwnProperty(obj, k)) { this.x = (this.x + obj[k]) % 256; } } }) iterTests.addTestCase('Object.keys(obj).forEach(function(k) { foo(obj[k]); }') .before(function () { this.x = 0; }) .run(function () { Object.keys(obj).forEach(function (k) { this.x = (this.x + obj[k]) % 256; }) }) iterTests.runAllTestsWithIterations([10, 100, 1000], 1e3, 10);})();
//
// Created by Seiji Emery on 9/4/15
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
// Checks various types of js iteration (for loops, for/in loops, Array.forEach, and Object.keys)
// for speed + efficiency. Mostly a sanity check for my own code.
//
Script.include("perfTest.js");
(function () {
var input1 = [];
var input2 = [];
var N = 1000;
for (var i = 0; i < N; ++i) {
input1.push(Math.random());
input2.push(Math.random());
}
TestCase.prototype.withArray = function(n, func) {
this.before(function () {
this.array = [];
for (var i = 0; i < n; ++i) {
this.array.push(0);
}
});
this.run(fcn);
}
print("For loop test -- prelim tests");
var prelimTests = new TestRunner();
prelimTests.addTestCase('Array.push (test component)')
.before(function () {
this.array = [];
})
.run(function () {
this.array.push(1);
});
prelimTests.addTestCase('Array.push with mul op (test component)')
.before(function() {
this.array = [];
})
.run(function (i) {
this.array.push(input1[i] * Math.PI);
})
prelimTests.runAllTestsWithIterations([1e4, 1e5, 1e6], 1e6, 10);
print("For loop test (n = " + N + ")");
var loopTests = new TestRunner();
loopTests.addTestCase('for (var i = 0; i < n; ++i) { ... }')
.before(function () {
this.array = [];
})
.run(function () {
for (var i = 0; i < N; ++i) {
this.array.push(input1[i] * Math.PI);
}
})
loopTests.addTestCase('while (n --> 0) { ... } (reversed)')
.before(function () {
this.array = [];
})
.run(function () {
var n = N;
while (n --> 0) {
this.array.push(input1[n] * Math.PI);
}
})
loopTests.addTestCase('Array.forEach(function(v, i) { ... })')
.before(function () {
this.array = [];
})
.run(function () {
input1.forEach(function(v) {
this.array.push(v * Math.PI);
}, this);
})
loopTests.addTestCase('Array.map(function(v, i) { ... })')
.run(function () {
this.array = input1.map(function (v) {
return v * Math.PI;
}, this);
});
loopTests.runAllTestsWithIterations([10, 100, 1000], 1e3, 10);
// Test iteration on object keys
// http://stackoverflow.com/questions/10726909/random-alpha-numeric-string-in-javascript
function makeRandomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
return result;
}
function randomString () {
var n = Math.floor(Math.random() * 18) + 12;
return makeRandomString(n, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
}
var obj = {}, numKeys = 1000;
while (numKeys --> 0) {
obj[randomString()] = Math.floor(Math.random() * 255);
}
print("Object iter tests (object has " + Object.keys(obj).length + " keys)");
var iterTests = new TestRunner();
iterTests.addTestCase('for (var k in obj) { foo(obj[k]); }')
.before(function () {
this.x = 0;
})
.run(function () {
for (var k in obj) {
this.x = (this.x + obj[k]) % 256;
}
});
iterTests.addTestCase('for (var k in obj) { if (Object.hasOwnProperty(obj, k)) { foo(obj[k]); } }')
.before(function () {
this.x = 0;
})
.run(function () {
for (var k in obj) {
if (Object.hasOwnProperty(obj, k)) {
this.x = (this.x + obj[k]) % 256;
}
}
})
iterTests.addTestCase('Object.keys(obj).forEach(function(k) { foo(obj[k]); }')
.before(function () {
this.x = 0;
})
.run(function () {
Object.keys(obj).forEach(function (k) {
this.x = (this.x + obj[k]) % 256;
})
})
iterTests.runAllTestsWithIterations([10, 100, 1000], 1e3, 10);
})();