1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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');
}
}
|