From eaccd0b56ae2426eeea9a07f0df18a1f8b5cea12 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 11 Apr 2010 22:27:49 -0500 Subject: [PATCH] vm: speed up nano-count primitive on Windows --- vm/os-windows-nt.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/vm/os-windows-nt.cpp b/vm/os-windows-nt.cpp index 4fea294a12..97cd2146af 100755 --- a/vm/os-windows-nt.cpp +++ b/vm/os-windows-nt.cpp @@ -18,17 +18,24 @@ u64 system_micros() u64 nano_count() { - LARGE_INTEGER count; - LARGE_INTEGER frequency; + static double scale_factor; + static u32 hi = 0; static u32 lo = 0; - BOOL ret; - ret = QueryPerformanceCounter(&count); + + LARGE_INTEGER count; + BOOL ret = QueryPerformanceCounter(&count); if(ret == 0) fatal_error("QueryPerformanceCounter", 0); - ret = QueryPerformanceFrequency(&frequency); - if(ret == 0) - fatal_error("QueryPerformanceFrequency", 0); + + if(scale_factor == 0.0) + { + LARGE_INTEGER frequency; + BOOL ret = QueryPerformanceFrequency(&frequency); + if(ret == 0) + fatal_error("QueryPerformanceFrequency", 0); + scale_factor = (1000000000.0 / frequency.QuadPart); + } #ifdef FACTOR_64 hi = count.HighPart; @@ -40,7 +47,7 @@ u64 nano_count() #endif lo = count.LowPart; - return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart)); + return (u64)((((u64)hi << 32) | (u64)lo) * scale_factor); } void sleep_nanos(u64 nsec)