Skip to content

Instantly share code, notes, and snippets.

@Raynos
Created October 7, 2016 22:00
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 Raynos/93d275463a90306b4b0779fed308550c to your computer and use it in GitHub Desktop.
Save Raynos/93d275463a90306b4b0779fed308550c to your computer and use it in GitHub Desktop.
'use strict';
function MyObject() {
this.counter = 0;
}
MyObject.prototype.doSomeWork = function doSomeWork() {
this.counter++;
};
MyObject.prototype.allocateClosure =
function allocateClosure() {
var self = this;
return function doWork() {
self.doSomeWork();
}
};
MyObject.prototype.allocateArrow =
function allocateArrow() {
return () => { this.doSomeWork() };
};
var ALLOC_COUNTER = 50 * 1000 * 1000;
var CALL_COUNTER = 400 * 1000 * 1000;
function testAllocateClosure() {
console.log('test allocate closure');
var obj = new MyObject();
var resultArr = new Array(10);
var start = Date.now();
for (var i = 0; i < ALLOC_COUNTER; i++) {
resultArr[i % 10] = obj.allocateClosure();
}
var end = Date.now();
console.log('time taken', end - start);
}
function testAllocateArrow() {
console.log('test allocate arrow');
var obj = new MyObject();
var resultArr = new Array(10);
var start = Date.now();
for (var i = 0; i < ALLOC_COUNTER; i++) {
resultArr[i % 10] = obj.allocateArrow();
}
var end = Date.now();
console.log('time taken', end - start);
}
function testCallArrow() {
console.log('test call arrow');
var obj = new MyObject();
var arrow = obj.allocateArrow();
var start = Date.now();
for (var i = 0; i < CALL_COUNTER; i++) {
arrow();
}
var end = Date.now();
console.log('time taken', end - start);
}
function testCallClosure() {
console.log('test call closure');
var obj = new MyObject();
var closure = obj.allocateClosure();
var start = Date.now();
for (var i = 0; i < CALL_COUNTER; i++) {
closure();
}
var end = Date.now();
console.log('time taken', end - start);
}
function main(mode) {
if (mode === 'alloc-closure') {
testAllocateClosure();
} else if (mode === 'alloc-arrow') {
testAllocateArrow();
} else if (mode === 'call-closure') {
testCallClosure();
} else if (mode === 'call-arrow') {
testCallArrow();
} else {
console.log('unsupported mode', mode);
}
}
main(process.argv[2]);
@Raynos
Copy link
Author

Raynos commented Oct 7, 2016

raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ node -v
v6.4.0
raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ node -p 'process.versions.v8'
5.0.71.60
raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ time node foo.js alloc-arrow
test allocate arrow
time taken 1365

real    0m1.415s
user    0m1.400s
sys 0m0.008s
raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ time node foo.js alloc-closure
test allocate closure
time taken 1346

real    0m1.400s
user    0m1.396s
sys 0m0.000s
raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ time node foo.js call-arrow
test call arrow
time taken 686

real    0m0.742s
user    0m0.740s
sys 0m0.000s
raynos at raynos-ThinkPad-T440p  ~/tmp/toy-func
$ time node foo.js call-closure
test call closure
time taken 677

real    0m0.739s
user    0m0.736s
sys 0m0.000s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment