summaryrefslogtreecommitdiff
path: root/benchmark/es
diff options
context:
space:
mode:
authorRod Vagg <rod@vagg.org>2016-07-07 16:31:19 +1000
committerRod Vagg <rod@vagg.org>2016-10-29 18:04:42 +1100
commit07cc9dfd05fa49e0b33b1b4dd74a36138f954e96 (patch)
treea35906aa6749402556a964557f45d117c004294a /benchmark/es
parent2c6ca32e8bcc6759a704bb525df71ac7b3b151ca (diff)
downloadandroid-node-v8-07cc9dfd05fa49e0b33b1b4dd74a36138f954e96.tar.gz
android-node-v8-07cc9dfd05fa49e0b33b1b4dd74a36138f954e96.tar.bz2
android-node-v8-07cc9dfd05fa49e0b33b1b4dd74a36138f954e96.zip
benchmark: add microbenchmarks for ES Map
PR-URL: https://github.com/nodejs/node/pull/7581 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Franziska Hinkelmann <ranziska.hinkelmann@gmail.com>
Diffstat (limited to 'benchmark/es')
-rw-r--r--benchmark/es/map-bench.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/benchmark/es/map-bench.js b/benchmark/es/map-bench.js
new file mode 100644
index 0000000000..574da25d53
--- /dev/null
+++ b/benchmark/es/map-bench.js
@@ -0,0 +1,96 @@
+'use strict';
+
+const common = require('../common.js');
+const assert = require('assert');
+
+const bench = common.createBenchmark(main, {
+ method: ['object', 'nullProtoObject', 'fakeMap', 'map'],
+ millions: [1]
+});
+
+function runObject(n) {
+ const m = {};
+ var i = 0;
+ bench.start();
+ for (; i < n; i++) {
+ m['i' + i] = i;
+ m['s' + i] = String(i);
+ assert.equal(m['i' + i], m['s' + i]);
+ m['i' + i] = undefined;
+ m['s' + i] = undefined;
+ }
+ bench.end(n / 1e6);
+}
+
+function runNullProtoObject(n) {
+ const m = Object.create(null);
+ var i = 0;
+ bench.start();
+ for (; i < n; i++) {
+ m['i' + i] = i;
+ m['s' + i] = String(i);
+ assert.equal(m['i' + i], m['s' + i]);
+ m['i' + i] = undefined;
+ m['s' + i] = undefined;
+ }
+ bench.end(n / 1e6);
+}
+
+function fakeMap() {
+ const m = {};
+ return {
+ get(key) { return m['$' + key]; },
+ set(key, val) { m['$' + key] = val; },
+ get size() { return Object.keys(m).length; },
+ has(key) { return Object.prototype.hasOwnProperty.call(m, '$' + key); }
+ };
+}
+
+function runFakeMap(n) {
+ const m = fakeMap();
+ var i = 0;
+ bench.start();
+ for (; i < n; i++) {
+ m.set('i' + i, i);
+ m.set('s' + i, String(i));
+ assert.equal(m.get('i' + i), m.get('s' + i));
+ m.set('i' + i, undefined);
+ m.set('s' + i, undefined);
+ }
+ bench.end(n / 1e6);
+}
+
+function runMap(n) {
+ const m = new Map();
+ var i = 0;
+ bench.start();
+ for (; i < n; i++) {
+ m.set('i' + i, i);
+ m.set('s' + i, String(i));
+ assert.equal(m.get('i' + i), m.get('s' + i));
+ m.set('i' + i, undefined);
+ m.set('s' + i, undefined);
+ }
+ bench.end(n / 1e6);
+}
+
+function main(conf) {
+ const n = +conf.millions * 1e6;
+
+ switch (conf.method) {
+ case 'object':
+ runObject(n);
+ break;
+ case 'nullProtoObject':
+ runNullProtoObject(n);
+ break;
+ case 'fakeMap':
+ runFakeMap(n);
+ break;
+ case 'map':
+ runMap(n);
+ break;
+ default:
+ throw new Error('Unexpected method');
+ }
+}