summaryrefslogtreecommitdiff
path: root/school/node_modules/w3c-hr-time/lib/clock-is-accurate.js
diff options
context:
space:
mode:
Diffstat (limited to 'school/node_modules/w3c-hr-time/lib/clock-is-accurate.js')
-rw-r--r--school/node_modules/w3c-hr-time/lib/clock-is-accurate.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/school/node_modules/w3c-hr-time/lib/clock-is-accurate.js b/school/node_modules/w3c-hr-time/lib/clock-is-accurate.js
new file mode 100644
index 0000000..920b499
--- /dev/null
+++ b/school/node_modules/w3c-hr-time/lib/clock-is-accurate.js
@@ -0,0 +1,61 @@
+"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;