Last active
June 21, 2016 12:23
-
-
Save rumkin/7522b04f9a6af9dda5099255a0d96558 to your computer and use it in GitHub Desktop.
Monomorphic vs megamorphic vs typed modes benchmark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Monomorphic x 1,989 ops/sec ±1.90% (71 runs sampled) | |
Megamorphic x 47.27 ops/sec ±1.03% (58 runs sampled) | |
Typed x 2,550 ops/sec ±2.10% (57 runs sampled) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Benchmark = require('benchmark'); | |
const suite = new Benchmark.Suite; | |
// Test data set size | |
const n = process.env.SET_SIZE || 100000; | |
// Monomorhpic objects array | |
const mono = Array(n); | |
// Megamorphic objects array | |
const mega = Array(n); | |
// Typed objects array | |
const typed = Array(n); | |
function Type(i) { | |
this.x =i; | |
this.n = null; | |
} | |
// Pregenerate objects | |
for (let i = 0; i < n; i++) { | |
mono[i] = { | |
n: null, // Add n to balance memory usage | |
x: i, | |
}; | |
mega[i] = {}; | |
mega[i]['k' + i] = null; | |
mega[i].x = i; | |
typed[i] = new Type(i); | |
} | |
function monoform(x) { | |
return x.x + x.x; | |
} | |
function megaform(x) { | |
return x.x + x.x; | |
} | |
function typedform(x) { | |
return x.x + x.x; | |
} | |
suite | |
.add('Monomorphic', function() { | |
for (var i = 0; i < n; i++) { | |
monoform(mono[i]); | |
} | |
}) | |
.add('Megamorphic', function() { | |
for (var i = 0; i < n; i++) { | |
megaform(mega[i]); | |
} | |
}) | |
.add('Typed', function() { | |
for (var i = 0; i < n; i++) { | |
typedform(typed[i]); | |
} | |
}) | |
.on('error', error => { | |
console.error(error); | |
}) | |
// add listeners | |
.on('cycle', function(event) { | |
console.log(String(event.target)); | |
}) | |
.on('complete', function() { | |
console.log('Fastest is ' + this.filter('fastest').map('name')); | |
}) | |
// run async | |
.run({async: false}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment