Skip to content

Commit ed31f9c

Browse files
rvaggMyles Borins
authored and
Myles Borins
committed
benchmark: add microbenchmarks for ES Map
PR-URL: #7581 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]>
1 parent f18f3b6 commit ed31f9c

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

benchmark/es/map-bench.js

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
'use strict';
2+
3+
const common = require('../common.js');
4+
const assert = require('assert');
5+
6+
const bench = common.createBenchmark(main, {
7+
method: ['object', 'nullProtoObject', 'fakeMap', 'map'],
8+
millions: [1]
9+
});
10+
11+
function runObject(n) {
12+
const m = {};
13+
var i = 0;
14+
bench.start();
15+
for (; i < n; i++) {
16+
m['i' + i] = i;
17+
m['s' + i] = String(i);
18+
assert.equal(m['i' + i], m['s' + i]);
19+
m['i' + i] = undefined;
20+
m['s' + i] = undefined;
21+
}
22+
bench.end(n / 1e6);
23+
}
24+
25+
function runNullProtoObject(n) {
26+
const m = Object.create(null);
27+
var i = 0;
28+
bench.start();
29+
for (; i < n; i++) {
30+
m['i' + i] = i;
31+
m['s' + i] = String(i);
32+
assert.equal(m['i' + i], m['s' + i]);
33+
m['i' + i] = undefined;
34+
m['s' + i] = undefined;
35+
}
36+
bench.end(n / 1e6);
37+
}
38+
39+
function fakeMap() {
40+
const m = {};
41+
return {
42+
get(key) { return m['$' + key]; },
43+
set(key, val) { m['$' + key] = val; },
44+
get size() { return Object.keys(m).length; },
45+
has(key) { return Object.prototype.hasOwnProperty.call(m, '$' + key); }
46+
};
47+
}
48+
49+
function runFakeMap(n) {
50+
const m = fakeMap();
51+
var i = 0;
52+
bench.start();
53+
for (; i < n; i++) {
54+
m.set('i' + i, i);
55+
m.set('s' + i, String(i));
56+
assert.equal(m.get('i' + i), m.get('s' + i));
57+
m.set('i' + i, undefined);
58+
m.set('s' + i, undefined);
59+
}
60+
bench.end(n / 1e6);
61+
}
62+
63+
function runMap(n) {
64+
const m = new Map();
65+
var i = 0;
66+
bench.start();
67+
for (; i < n; i++) {
68+
m.set('i' + i, i);
69+
m.set('s' + i, String(i));
70+
assert.equal(m.get('i' + i), m.get('s' + i));
71+
m.set('i' + i, undefined);
72+
m.set('s' + i, undefined);
73+
}
74+
bench.end(n / 1e6);
75+
}
76+
77+
function main(conf) {
78+
const n = +conf.millions * 1e6;
79+
80+
switch (conf.method) {
81+
case 'object':
82+
runObject(n);
83+
break;
84+
case 'nullProtoObject':
85+
runNullProtoObject(n);
86+
break;
87+
case 'fakeMap':
88+
runFakeMap(n);
89+
break;
90+
case 'map':
91+
runMap(n);
92+
break;
93+
default:
94+
throw new Error('Unexpected method');
95+
}
96+
}

0 commit comments

Comments
 (0)