[fpc-pascal] Sub-millisecond time measuring

Rafael Picanço cpicanco42 at gmail.com
Tue Jul 2 13:04:18 CEST 2024


Hi everyone. I am sharing some cross-platform timing I have done, it would
be great to hear from you.
________________________________________
For mac I translated this python implementation to free pascal:
https://github.com/pupil-labs/pyuvc/blob/master/pyuvc-source/darwin_time.pxi
):
```
unit timestamps.machtime;

{$mode objfpc}{$H+}
{$modeswitch objectivec1}
{$linkframework CoreFoundation}

interface

type
  mach_timebase_info_data_t = record
    numer: UInt32;
    denom: UInt32;
  end;
  mach_timebase_info_t = ^mach_timebase_info_data_t;

function mach_absolute_time: UInt64; cdecl; external name
'mach_absolute_time';
function mach_timebase_info(info: mach_timebase_info_t): Integer; cdecl;
external name 'mach_timebase_info';

implementation

end.
```

However, I could not test it extensively. But here is some sample code:

```
uses ctypes,  timestamps.machtime;
{...}
var
  timeConvert: Float = 0.0;
//function get_sys_time_monotonic: Float;
function ClockMonotonic : Float;
var
  timeBase: mach_timebase_info_data_t;
begin
  if timeConvert = 0.0 then begin
    mach_timebase_info(@timeBase);
    timeConvert :=
      (Float(timeBase.numer) / Float(timeBase.denom) / Float(1000000000.0);
  end;
  Result := mach_absolute_time() * timeConvert;
end;
```
____________________________________________________
For linux, I am used to clock_gettime (
https://linux.die.net/man/3/clock_gettime):
```
unit timestamps.gnulinux;
uses Linux, UnixType, Math;
{...}
function ClockMonotonic: Float;
var
  tp: timespec;
  a, b : Float;
begin
  clock_gettime(CLOCK_MONOTONIC, @tp);
  a := Float(tp.tv_sec);
  b := Float(tp.tv_nsec) * 1e-9;
  Result := a+b;
end;
```
_________________________________________________
For windows I am used to QueryPerformanceCounter:
```
unit timestamps.windows;
uses Windows, Math;
{...}
var
  PerSecond : TLargeInteger;
function ClockMonotonic: Float;
var
  Count : TLargeInteger;
begin
  QueryPerformanceCounter(Count);
  Result := Float(Count) / Float(PerSecond);
end;

initialization
   QueryPerformanceFrequency(PerSecond);
```
Of course, you don't need any "ToSeconds" conversion if you don't want to.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20240702/ace2a788/attachment.htm>


More information about the fpc-pascal mailing list