UNPKG

rdtsc

Version:

The most high resolution cross platform timing in NodeJs that use processor command RDTSC. Calculate performance with accuracy +/- 4 processor cycles.

64 lines (61 loc) 2.12 kB
import { getRdtscDefault } from './rdtscDefault.mjs'; function calcPerformance({ rdtsc: _rdtsc, time, funcs, }) { const { init, mark0, mark1, minCycles, rdtsc, runInRealtimePriority, } = _rdtsc || getRdtscDefault(); return runInRealtimePriority(() => { const testTime = time; if (!testTime || testTime <= 0) { throw new Error(`testTime ${testTime} <= 0`); } const f = funcs; f.forEach(o => { if (typeof o !== 'function') { throw new Error(`argument (${o}) is not a function`); } }); const funcsCount = f.length; if (!funcsCount) { throw new Error('functions count == 0'); } const m0 = mark0; const m1 = mark1; const endTime = performance.now() + testTime; let i = 0; let count = funcsCount; init(funcsCount); const startCycles = rdtsc(); do { const fn = f[i % funcsCount]; m0(); fn(); m1(); i++; if (i >= count) { const remainingTime = endTime - performance.now(); if (remainingTime <= 0) { break; } count = ~~Math.ceil(i * testTime / (testTime + Number(remainingTime) / 1000000)); count = (~~(count / funcsCount)) * funcsCount; } } while (true); const cycles = minCycles(); const absoluteDiff = funcsCount > 1 ? cycles.filter((_, i) => i).map(o => Number(o - cycles[0])) : void 0; const relativeDiff = funcsCount > 2 && absoluteDiff[0] > 0 ? absoluteDiff.filter((_, i) => i).map(o => o / absoluteDiff[0]) : void 0; return { calcInfo: { iterationCycles: Number(rdtsc() - startCycles) / i, iterations: i, funcsCount, testTime, }, cycles, absoluteDiff, relativeDiff, }; }); } export { calcPerformance };