(foreign-declare "#include ") (define get-nanosecs) (let ((%factor 0)) (define %calc-freq (foreign-lambda* unsigned-integer64 () "LARGE_INTEGER li;" "if( !QueryPerformanceFrequency( &li ) ) return( 0 );" "return( li.QuadPart );")) (define %calc-time (foreign-lambda* unsigned-integer64 () "LARGE_INTEGER li;" "if( !QueryPerformanceCounter( &li ) ) return( 0 );" "return( li.QuadPart );")) (define (%calc-factor) (/ (%calc-freq) #e1e9)) (set! get-nanosecs (lambda () (floor (* (%calc-time) %factor)))) ;we immediatly determine the factor ;it should not change as long as the machine runs (set! %factor (%calc-factor)) (unless (positive? %factor) (error 'get-nanosecs "cannot determine scale factor" %factor) ) )