current commit
261020.6 · ffi: add getFunction cache-miss benchmark
'use strict';

// Measures repeated getFunction() calls with a cached callable rather than
// call throughput. The warmup populates the cache for the measured symbol.
// See get-function-cache-miss.js for first-time resolution, including trampoline
// creation for fast-eligible signatures on supported platforms.

const common = require('../common.js');
const { DynamicLibrary } = require('node:ffi');
const { libraryPath, ensureFixtureLibrary } = require('./common.js');

const bench = common.createBenchmark(main, {
  signature: ['fast', 'slow'],
  n: [1e3],
});

ensureFixtureLibrary();

const signatures = {
  fast: { name: 'add_i32', return: 'i32', arguments: ['i32', 'i32'] },
  slow: {
    name: 'sum_8_i32',
    return: 'i32',
    arguments: ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'],
  },
};

function main({ n, signature }) {
  const { name, ...definition } = signatures[signature];
  const lib = new DynamicLibrary(libraryPath);

  // Populate the callable cache before measuring repeated lookups.
  lib.getFunction(name, definition);

  bench.start();
  for (let i = 0; i < n; ++i)
    lib.getFunction(name, definition);
  bench.end(n);

  lib.close();
}