// http://codereview.stackexchange.com/questions/110819/delphi-convenience-wrapper-for-getsystemtimepreciseasfiletime program dev_GSTAFT_D7; {$APPTYPE CONSOLE} uses SysUtils, Windows, UTestGSTAFT_v1 in 'UTestGSTAFT_v1.pas'; function GSTAFT_resolution (iteration_count_ptr: PInteger = nil): Int64; var ft0, ft1, ft2: Int64; i: Integer; begin i := 0; GetSystemTimeAsFileTime(TFileTime(ft0)); repeat GetSystemTimeAsFileTime(TFileTime(ft1)); until ft1 <> ft0; repeat GetSystemTimeAsFileTime(TFileTime(ft2)); Inc(i); result := ft2 - ft1; until result <> 0; if iteration_count_ptr <> nil then iteration_count_ptr^ := i; end; function zw_GSTAFT_resolution (iteration_count_ptr: PInteger = nil): Int64; var ft0, ft1, ft2: Int64; i: Integer; begin i := 0; zw_GetSystemTimeAsFileTime(TFileTime(ft0)); repeat zw_GetSystemTimeAsFileTime(TFileTime(ft1)); until ft1 <> ft0; repeat zw_GetSystemTimeAsFileTime(TFileTime(ft2)); Inc(i); result := ft2 - ft1; until result <> 0; if iteration_count_ptr <> nil then iteration_count_ptr^ := i; end; type TMeasurementFunc = function (iteration_count_ptr: PInteger): Int64; procedure print_measurements (f: TMeasurementFunc; rounds: Integer = 4); var i, iterations: Integer; delta: Int64; begin Write(IntToHex(LongInt(@f),1), ':'); for i := 1 to rounds do begin delta := f(@iterations); Write(' ', delta, ' (', iterations, ')'); end; WriteLn; end; // D7/32 under WinXP/32: // 4084DC: 100144 (3109338) 100144 (3092557) 100144 (3142066) 100144 (3157937) // 408544: 100144 (3014201) 100144 (3039902) 100144 (3081043) 100144 (3043956) // D7/32 under Win81/64: // 4084DC: 10000 (279981) 10003 (285789) 10004 (266131) 10004 (232320) // 408544: 3 (15) 3 (15) 3 (10) 3 (14) // // RX/32 under WinXP/32 // 419CD0: 100144 (3183747) 100144 (2961456) 100144 (3176890) 100144 (3106160) // 419D38: 100144 (3052794) 100144 (3059331) 100144 (3057960) 100144 (2980830) // RX/32 under Win81/64 // 419CD0: 9966 (271333) 10004 (277470) 10004 (248138) 10004 (270506) // 419D38: 4 (14) 3 (15) 4 (15) 3 (12) // RX/64 under Win81/64 // 426300: 10007 (176924) 10004 (180450) 10004 (175266) 10078 (135203) // 426360: 3 (24) 3 (24) 3 (23) 3 (24) begin print_measurements(GSTAFT_resolution); print_measurements(zw_GSTAFT_resolution); end.