1'use strict';
2
3/* eslint-disable dot-notation */
4
5const common = require('../common.js');
6
7const bench = common.createBenchmark(main, {
8  method: ['property', 'string', 'variable', 'symbol'],
9  n: [1e9],
10});
11
12function runProperty(n) {
13  const object = {};
14
15  bench.start();
16  for (let i = 0; i < n; i++) {
17    object.p1 = 21;
18    object.p2 = 21;
19    object.p1 += object.p2;
20  }
21  bench.end(n);
22}
23
24function runString(n) {
25  const object = {};
26
27  bench.start();
28  for (let i = 0; i < n; i++) {
29    object['p1'] = 21;
30    object['p2'] = 21;
31    object['p1'] += object['p2'];
32  }
33  bench.end(n);
34}
35
36function runVariable(n) {
37  const object = {};
38  const var1 = 'p1';
39  const var2 = 'p2';
40
41  bench.start();
42  for (let i = 0; i < n; i++) {
43    object[var1] = 21;
44    object[var2] = 21;
45    object[var1] += object[var2];
46  }
47  bench.end(n);
48}
49
50function runSymbol(n) {
51  const object = {};
52  const symbol1 = Symbol('p1');
53  const symbol2 = Symbol('p2');
54
55  bench.start();
56  for (let i = 0; i < n; i++) {
57    object[symbol1] = 21;
58    object[symbol2] = 21;
59    object[symbol1] += object[symbol2];
60  }
61  bench.end(n);
62}
63
64function main({ n, method }) {
65
66  switch (method) {
67    case 'property':
68      runProperty(n);
69      break;
70    case 'string':
71      runString(n);
72      break;
73    case 'variable':
74      runVariable(n);
75      break;
76    case 'symbol':
77      runSymbol(n);
78      break;
79    default:
80      throw new Error(`Unexpected method "${method}"`);
81  }
82}
83