You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
61 lines
1.4 KiB
"use strict"; |
|
|
|
const { hrtime } = require("./utils"); |
|
|
|
// The HR-TIME spec calls for 5-μs accuracy. Check that we have that in both hrtime() and Date.now(). |
|
|
|
function testClockAccuracy() { |
|
// Test hrtime() first. The check is simpler and more stable, and we use hrtime() to measure Date.now()'s performance. |
|
const roundTrip = hrtime(hrtime()); |
|
if (roundTrip[0] > 1 || roundTrip[1] > 5e3 * 2) { |
|
return false; |
|
} |
|
|
|
// Test Date.now() twice: first with a looser bound (10 μs) but with a smaller run time to filter out very bad |
|
// Date.now() performance, and then with a tighter bound (5 μs) to check we have the accuracy we need. |
|
let times; |
|
// eslint-disable-next-line no-unused-vars |
|
let cur; |
|
let start; |
|
let end; |
|
|
|
times = 100; |
|
start = hrtime(); |
|
while (times-- > 0) { |
|
cur = Date.now(); |
|
} |
|
end = hrtime(start); |
|
if ((end[0] * 1e9 + end[1]) > 1000000) { |
|
return false; |
|
} |
|
|
|
times = 10000; |
|
start = hrtime(); |
|
while (times-- > 0) { |
|
cur = Date.now(); |
|
} |
|
end = hrtime(start); |
|
if ((end[0] * 1e9 + end[1]) > 50000000) { |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
// Warm up the function. |
|
testClockAccuracy(); |
|
testClockAccuracy(); |
|
testClockAccuracy(); |
|
|
|
const TIMES = 5; |
|
const THRESHOLD = 0.6 * TIMES; |
|
let accurates = 0; |
|
for (let i = 0; i < TIMES; i++) { |
|
if (testClockAccuracy()) { |
|
accurates++; |
|
} |
|
} |
|
|
|
const isAccurate = accurates >= THRESHOLD; |
|
|
|
module.exports = isAccurate;
|
|
|