1'use strict';
2
3const { createBenchmark } = require('../common.js');
4const { format } = require('util');
5
6const methods = [
7  'restAndSpread',
8  'argumentsAndApply',
9  'restAndApply',
10  'predefined',
11];
12
13const bench = createBenchmark(main, {
14  method: methods,
15  n: [1e6],
16});
17
18function usingRestAndSpread(...args) {
19  format(...args);
20}
21
22function usingRestAndApply(...args) {
23  format.apply(null, args);
24}
25
26function usingArgumentsAndApply() {
27  format.apply(null, arguments);
28}
29
30function usingPredefined() {
31  format('part 1', 'part', 2, 'part 3', 'part', 4);
32}
33
34function main({ n, method, args }) {
35  let fn;
36  switch (method) {
37    case 'restAndSpread':
38      fn = usingRestAndSpread;
39      break;
40    case 'restAndApply':
41      fn = usingRestAndApply;
42      break;
43    case 'argumentsAndApply':
44      fn = usingArgumentsAndApply;
45      break;
46    case 'predefined':
47      fn = usingPredefined;
48      break;
49    default:
50      throw new Error(`Unexpected method "${method}"`);
51  }
52
53  bench.start();
54  for (let i = 0; i < n; i++)
55    fn('part 1', 'part', 2, 'part 3', 'part', 4);
56  bench.end(n);
57}
58