| // Show the difference between calling a V8 binding C++ function | |
| // relative to a comparable N-API C++ function, | |
| // in various types/numbers of arguments. | |
| // Reports n of calls per second. | |
| 'use strict'; | |
| const common = require('../../common.js'); | |
| let v8; | |
| let napi; | |
| try { | |
| v8 = require(`./build/${common.buildType}/binding`); | |
| } catch { | |
| console.error(`${__filename}: V8 Binding failed to load`); | |
| process.exit(0); | |
| } | |
| try { | |
| napi = require(`./build/${common.buildType}/napi_binding`); | |
| } catch { | |
| console.error(`${__filename}: NAPI-Binding failed to load`); | |
| process.exit(0); | |
| } | |
| const argsTypes = ['String', 'Number', 'Object', 'Array', 'Typedarray', | |
| '10Numbers', '100Numbers', '1000Numbers']; | |
| const generateArgs = (argType) => { | |
| let args = []; | |
| if (argType === 'String') { | |
| args.push('The quick brown fox jumps over the lazy dog'); | |
| } else if (argType === 'LongString') { | |
| args.push(Buffer.alloc(32768, '42').toString()); | |
| } else if (argType === 'Number') { | |
| args.push(Math.floor(314158964 * Math.random())); | |
| } else if (argType === 'Object') { | |
| args.push({ | |
| map: 'add', | |
| operand: 10, | |
| data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
| reduce: 'add', | |
| }); | |
| } else if (argType === 'Array') { | |
| const arr = []; | |
| for (let i = 0; i < 50; ++i) { | |
| arr.push(Math.random() * 10e9); | |
| } | |
| args.push(arr); | |
| } else if (argType === 'Typedarray') { | |
| const arr = new Uint32Array(1000); | |
| for (let i = 0; i < 1000; ++i) { | |
| arr[i] = Math.random() * 4294967296; | |
| } | |
| args.push(arr); | |
| } else if (argType === '10Numbers') { | |
| args.push(10); | |
| for (let i = 0; i < 9; ++i) { | |
| args = [...args, ...generateArgs('Number')]; | |
| } | |
| } else if (argType === '100Numbers') { | |
| args.push(100); | |
| for (let i = 0; i < 99; ++i) { | |
| args = [...args, ...generateArgs('Number')]; | |
| } | |
| } else if (argType === '1000Numbers') { | |
| args.push(1000); | |
| for (let i = 0; i < 999; ++i) { | |
| args = [...args, ...generateArgs('Number')]; | |
| } | |
| } | |
| return args; | |
| }; | |
| const bench = common.createBenchmark(main, { | |
| type: argsTypes, | |
| engine: ['v8', 'napi'], | |
| n: [1, 1e1, 1e2, 1e3, 1e4, 1e5], | |
| }); | |
| function main({ n, engine, type }) { | |
| const bindings = engine === 'v8' ? v8 : napi; | |
| const methodName = 'callWith' + type; | |
| const fn = bindings[methodName]; | |
| if (fn) { | |
| const args = generateArgs(type); | |
| bench.start(); | |
| for (let i = 0; i < n; i++) { | |
| fn.apply(null, args); | |
| } | |
| bench.end(n); | |
| } | |
| } |