Skip to content

Instantly share code, notes, and snippets.

@fidel-karsto
Last active December 19, 2015 15:58
Show Gist options
  • Save fidel-karsto/5980000 to your computer and use it in GitHub Desktop.
Save fidel-karsto/5980000 to your computer and use it in GitHub Desktop.
performance comparison of different loop technics
var size = 10e6, // array size - the larger the better
// http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
toType = function(obj) {
return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
},
// modify function used in loop peration
modifyFn = function(val) {
return val * 2;
},
// caching initialisation result for repeated use
memo = function (fn) {
var cache = {};
return function () {
var key = [].join.call(arguments, '§') + '§';
if (!(key in cache)) {
cache[key] = fn.apply(this, arguments);
}
// arrays keep references to their values, therefore the result array needs to be cloned!
// otherwise returning the original result array would cause a side effect!
if (toType(cache[key]) === "array") {
return cache[key].slice();
} else {
return cache[key];
}
};
};
function init(size) {
console.time("init array");
var result = [];
for (var i=0; i < size; i++) {
result.push(i);
}
console.timeEnd("init array");
return result;
}
cachedInit = memo(init);
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("for loop - array.length access");
for (var i=0; i<testArr.length; i++) {
testArr[i] = modifyFn(testArr[i]);
}
console.timeEnd("for loop - array.length access");
//console.log(testArr);
}());
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("for loop - array.length saved");
for (var i=0, len=testArr.length; i<len; i++) {
testArr[i] = modifyFn(testArr[i]);
}
console.timeEnd("for loop - array.length saved");
//console.log(testArr);
}());
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("while loop");
var i = 0, len = testArr.length;
while (i < len) {
testArr[i] = modifyFn(testArr[i]);
i++;
}
console.timeEnd("while loop");
//console.log(testArr);
}());
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("do while loop");
var i = 0, len = testArr.length;
do {
testArr[i] = modifyFn(testArr[i]);
i++;
} while (i < len)
console.timeEnd("do while loop");
//console.log(testArr);
}());
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("forEach loop");
testArr.forEach(function(index, element) {
testArr[index] = modifyFn(element);
});
console.timeEnd("forEach loop");
//console.log(testArr);
}());
(function(){
var testArr = cachedInit(size);
//console.log(testArr);
console.time("map loop");
testArr.map(function(element) {
return modifyFn(element);
});
console.timeEnd("map loop");
//console.log(testArr);
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment