62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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;
 |