Skip to content

Instantly share code, notes, and snippets.

@jcmoore
Created January 23, 2014 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jcmoore/8583806 to your computer and use it in GitHub Desktop.
Save jcmoore/8583806 to your computer and use it in GitHub Desktop.
var go = (function (size, iterations) {
var l = size || 33;
var k = "A";
var j = k.charCodeAt(0);
var i = 0;
var m = j;
var n = null;
var arr = []; // array with numeric index
var obj = {}; // object with non-numeric key
var seq = {}; // object with numeric key
var alpha = new Function ();
var omega = new Function ();
for (i = 0; i < l; i++) {
arr[i] = i;
alpha[i] = i;
seq[i] = i;
k = String.fromCharCode(j++);
obj[k] = i;
omega[k] = i;
}
n = j;
var log = (typeof console === "undefined" ? print : function () {
console.log.apply(console, arguments);
});
var s;
var reps = iterations || 100000;
var r = 0;
var q; // key index
var p; // key count
var o; // object keys
var t;
t = Date.now();
log(l+" (key/index count)");
log(reps+" (read/write repetitions)");
log("Array JSON -- "+JSON.stringify(arr));
log("Object JSON -- "+JSON.stringify(obj));
//return;
for (r = 0; r < reps; r++) {
for (i = 0; i < l; i++) {
s = arr[i];
arr[i] = s + 1;
}
}
log((Date.now() - t)+" (arr with index)"), (t = Date.now());
for (r = 0; r < reps; r++) {
for (i = 0; i < l; i++) {
s = alpha[i];
alpha[i] = s + 1;
}
}
log((Date.now() - t)+" (alpha with index)"), (t = Date.now());
for (r = 0; r < reps; r++) {
for (k in obj) {
s = obj[k];
obj[k] = s + 1;
}
}
log((Date.now() - t)+" (obj with indirect key)"), (t = Date.now());
for (r = 0; r < reps; r++) {
for (k in omega) {
s = omega[k];
omega[k] = s + 1;
}
}
log((Date.now() - t)+" (omega with indirect key)"), (t = Date.now());
for (r = 0; r < reps; r++) {
o = Object.keys(obj);
p = o.length;
q = 0;
for (q = 0; q < p; q++) {
k = o[q];
s = obj[k];
obj[k] = s + 1;
}
}
log((Date.now() - t)+" (obj with direct key)"), (t = Date.now());
for (r = 0; r < reps; r++) {
o = Object.keys(omega);
p = o.length;
q = 0;
for (q = 0; q < p; q++) {
k = o[q];
s = omega[k];
omega[k] = s + 1;
}
}
log((Date.now() - t)+" (omega with direct key)"), (t = Date.now());
o = Object.keys(obj);
p = o.length;
for (r = 0; r < reps; r++) {
q = 0;
for (q = 0; q < p; q++) {
k = o[q];
s = obj[k];
obj[k] = s + 1;
}
}
log((Date.now() - t)+" (obj with direct key -- explicitly hoisted loop-invariants for comparison)"), (t = Date.now());
for (r = 0; r < reps; r++) {
for (i = 0; i < l; i++) {
s = seq[i];
seq[i] = s + 1;
}
}
log((Date.now() - t)+" (seq with index)"), (t = Date.now());
for (r = 0; r < reps; r++) {
for (k in seq) {
s = seq[k];
seq[k] = s + 1;
}
}
log((Date.now() - t)+" (seq with indirect key)"), (t = Date.now());
for (r = 0; r < reps; r++) {
o = Object.keys(seq);
p = o.length;
q = 0;
for (q = 0; q < p; q++) {
k = o[q];
s = seq[k];
seq[k] = s + 1;
}
}
log((Date.now() - t)+" (seq with direct key)"), (t = Date.now());
log(""); // arbitrary space
/*
go(15, 1000000)
15 (key/index count)
1000000 (read/write repetitions)
Array JSON -- [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
Object JSON -- {"A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14}
160 (arr with index)
162 (alpha with index)
1316 (obj with indirect key)
1358 (omega with indirect key)
1774 (obj with direct key)
1773 (omega with direct key)
1325 (obj with direct key -- explicitly hoisted loop-invariants for comparison)
156 (seq with index)
2495 (seq with indirect key)
1830 (seq with direct key)
go(16, 1000000)
16 (key/index count)
1000000 (read/write repetitions)
Array JSON -- [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
Object JSON -- {"A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15}
170 (arr with index)
172 (alpha with index)
3086 (obj with indirect key)
3131 (omega with indirect key)
2055 (obj with direct key)
1993 (omega with direct key)
1386 (obj with direct key -- explicitly hoisted loop-invariants for comparison)
164 (seq with index)
2635 (seq with indirect key)
1900 (seq with direct key)
*/
});
go(33, 100000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment