rdtsc
Version:
The most high resolution cross platform timing in NodeJs that use processor command RDTSC. Calculate performance with accuracy +/- 4 processor cycles.
70 lines (65 loc) • 3.02 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var binding_index = require('./binding/index.cjs');
var binding_binding = require('./binding/binding.cjs');
require('./binding/import.cjs');
function threadPriorityToString(priority) {
switch (priority) {
case binding_binding.ThreadPriority.Idle: return 'Idle';
case binding_binding.ThreadPriority.Lowest: return 'Lowest';
case binding_binding.ThreadPriority.BelowNormal: return 'BelowNormal';
case binding_binding.ThreadPriority.Normal: return 'Normal';
case binding_binding.ThreadPriority.AboveNormal: return 'AboveNormal';
case binding_binding.ThreadPriority.Highest: return 'Highest';
case binding_binding.ThreadPriority.Realtime: return 'Realtime';
default: return `Unknown(${priority})`;
}
}
function processPriorityToString(priority) {
switch (priority) {
case binding_binding.ProcessPriority.Idle: return 'Idle';
case binding_binding.ProcessPriority.BelowNormal: return 'BelowNormal';
case binding_binding.ProcessPriority.Normal: return 'Normal';
case binding_binding.ProcessPriority.AboveNormal: return 'AboveNormal';
case binding_binding.ProcessPriority.Highest: return 'Highest';
case binding_binding.ProcessPriority.Realtime: return 'Realtime';
default: return `Unknown(${priority})`;
}
}
function runInRealtimePriority(func) {
if (!binding_index.isWin) {
return func();
}
const previousThreadPriority = binding_index.getThreadPriority();
const previousProcessPriority = binding_index.getProcessPriority();
function _finally() {
binding_index.setProcessPriority(previousProcessPriority);
binding_index.setThreadPriority(previousThreadPriority);
}
try {
binding_index.setProcessPriority(binding_binding.ProcessPriority.Realtime);
binding_index.setThreadPriority(binding_binding.ThreadPriority.Realtime);
const threadPriority = binding_index.getThreadPriority();
const processPriority = binding_index.getProcessPriority();
if (threadPriority !== binding_binding.ThreadPriority.Realtime || processPriority !== binding_binding.ProcessPriority.Realtime) {
console.warn(`Failed to set realtime priority: process=${processPriorityToString(processPriority)}, thread=${threadPriorityToString(threadPriority)}`);
}
const result = func();
if (result != null && typeof result === 'object' && typeof result.then === 'function') {
return result.then(o => {
_finally();
return o;
}, (err) => {
_finally();
throw err;
});
}
return result;
}
finally {
_finally();
}
}
exports.processPriorityToString = processPriorityToString;
exports.runInRealtimePriority = runInRealtimePriority;
exports.threadPriorityToString = threadPriorityToString;