// 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); } }