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; |