-
-
Save srikumarks/1431640 to your computer and use it in GitHub Desktop.
function timeit(f, N, S) { | |
var start, timeTaken; | |
var stats = {min: 1e50, max: 0, N: 0, sum: 0, sqsum: 0}; | |
var i; | |
for (i = 0; i < S; ++i) { | |
start = Date.now(); | |
f(N); | |
timeTaken = Date.now() - start; | |
stats.min = Math.min(timeTaken, stats.min); | |
stats.max = Math.max(timeTaken, stats.max); | |
stats.sum += timeTaken; | |
stats.sqsum += timeTaken * timeTaken; | |
stats.N++ | |
} | |
var mean = stats.sum / stats.N; | |
var sqmean = stats.sqsum / stats.N; | |
return {min: stats.min, max: stats.max, mean: mean, spread: Math.sqrt(sqmean - mean * mean)}; | |
} | |
var variable1 = 10; | |
var variable2 = 10; | |
var variable3 = 10; | |
var variable4 = 10; | |
var variable5 = 10; | |
var variable6 = 10; | |
var variable7 = 10; | |
var variable8 = 10; | |
var variable9 = 10; | |
var variable10 = 10; | |
function varAccess(N) { | |
var i, sum; | |
for (i = 0; i < N; ++i) { | |
sum += variable1; | |
sum += variable2; | |
sum += variable3; | |
sum += variable4; | |
sum += variable5; | |
sum += variable6; | |
sum += variable7; | |
sum += variable8; | |
sum += variable9; | |
sum += variable10; | |
} | |
return sum; | |
} | |
const constant1 = 10; | |
const constant2 = 10; | |
const constant3 = 10; | |
const constant4 = 10; | |
const constant5 = 10; | |
const constant6 = 10; | |
const constant7 = 10; | |
const constant8 = 10; | |
const constant9 = 10; | |
const constant10 = 10; | |
function constAccess(N) { | |
var i, sum; | |
for (i = 0; i < N; ++i) { | |
sum += constant1; | |
sum += constant2; | |
sum += constant3; | |
sum += constant4; | |
sum += constant5; | |
sum += constant6; | |
sum += constant7; | |
sum += constant8; | |
sum += constant9; | |
sum += constant10; | |
} | |
return sum; | |
} | |
function control(N) { | |
var i, sum; | |
for (i = 0; i < N; ++i) { | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
sum += 10; | |
} | |
return sum; | |
} | |
console.log("ctl = " + JSON.stringify(timeit(control, 10000000, 50))); | |
console.log("con = " + JSON.stringify(timeit(constAccess, 10000000, 50))); | |
console.log("var = " + JSON.stringify(timeit(varAccess, 10000000, 50))); |
tl;dr DONT JUDGE USING THE PREVIOUS RESULTS.
V8 changed completely since this was published and you should not accept any benchmarks that are older than 3 months.
ctl = {"min":124,"max":243,"mean":133.12,"spread":16.138946681862468}
con = {"min":123,"max":259,"mean":137.9,"spread":23.7126548492572}
var = {"min":126,"max":282,"mean":139.14,"spread":24.459771053711915}
New results with Node 5:
ctl = {"min":228,"max":260,"mean":230.76,"spread":5.213674328149501}
con = {"min":228,"max":276,"mean":239.14,"spread":10.897724533131056}
var = {"min":261,"max":323,"mean":282.46,"spread":7.756829249121327}
Node 6.6.0:
ctl = {"min":92,"max":96,"mean":93.34,"spread":0.7901898506047685}
con = {"min":92,"max":95,"mean":93.38,"spread":0.7180529228410895}
var = {"min":92,"max":103,"mean":93.78,"spread":1.9420607611499223}
Node 6.9.2 (Physical machine)
ctl = {"min":87,"max":132,"mean":88.84,"spread":6.313034135817678}
con = {"min":87,"max":89,"mean":87.74,"spread":0.48207883172856697}
var = {"min":87,"max":94,"mean":88.4,"spread":1.6970562748472102}
Node 6.9.2 (Docker container)
ctl = {"min":87,"max":131,"mean":88.78,"spread":6.162110028228955}
con = {"min":87,"max":90,"mean":87.74,"spread":0.7432361670428108}
var = {"min":87,"max":90,"mean":87.72,"spread":0.6013318551350664}
Node 7.3.0 (Docker container)
ctl = {"min":87,"max":134,"mean":88.84,"spread":6.60411992622783}
con = {"min":87,"max":464,"mean":321.32,"spread":123.30684328130376}
var = {"min":87,"max":89,"mean":87.68,"spread":0.5810335618524364}
con.spread
heavily increased in7.3.0
, dockerized environnement does not seems to be responsible.
Be aware that all the sum +=
return NaN
due to the uninitialized sum.
Benchmarks results seems deeply affected by this unexpected behavior.
➜ ✗ node temp.js
ctl = {"min":6,"max":109,"mean":10.26,"spread":20.06071783361702}
con = {"min":6,"max":111,"mean":10.34,"spread":20.44857941276117}
var = {"min":6,"max":113,"mean":10.18,"spread":20.28663599515701}
➜ ✗ node -v
v12.16.0
My measurements using node.js v0.6.3 on MacOSX -
ctl = {"min":182,"max":187,"mean":183.8,"spread":0.98}
con = {"min":770,"max":789,"mean":774.92,"spread":3.16}
var = {"min":196,"max":253,"mean":224.42,"spread":5.96}
(The spread rounded to two decimal places)