Lazarus在Win和Linux下的計時

禁卫军發表於2024-08-16

一、毫秒級

Linux 平臺示例(毫秒)
program HighPrecisionTimer;

{$mode objfpc}{$H+}

uses
BaseUnix, SysUtils,Linux;

var
StartTime, EndTime: TTimeSpec;
Elapsed: Double;
begin
// 獲取開始時間
clock_gettime(CLOCK_MONOTONIC, @StartTime);

// 你的程式碼塊
Sleep(1); // 示例延時,替換為你的程式碼

// 獲取結束時間
clock_gettime(CLOCK_MONOTONIC, @EndTime);

// 計算耗時(毫秒)
Elapsed := (EndTime.tv_sec - StartTime.tv_sec) * 1e3 + (EndTime.tv_nsec - StartTime.tv_nsec) / 1e6;
WriteLn('Elapsed time: ', Elapsed:0:3, ' ms');
end.

Windows 平臺示例(毫秒)
program HighPrecisionTimerWindows;

{$mode objfpc}{$H+}

uses
Windows, SysUtils;

var
Frequency: Int64;
StartCount, EndCount: Int64;
Elapsed: Double;
begin
QueryPerformanceFrequency(Frequency); // 獲取計時器頻率
QueryPerformanceCounter(StartCount); // 開始計時

// 你的程式碼塊
Sleep(1); // 示例延時,替換為你的程式碼

QueryPerformanceCounter(EndCount); // 結束計時

// 計算耗時(毫秒)
Elapsed := (EndCount - StartCount) * 1e3 / Frequency; // 計算耗時(毫秒)
WriteLn('Elapsed time: ', Elapsed:0:3, ' ms');
end.

二、微秒級

Linux 平臺示例(浮點微秒)
program HighPrecisionTimer;

{$mode objfpc}{$H+}

uses
BaseUnix, SysUtils,Linux;

var
StartTime, EndTime: TTimeSpec;
Elapsed: Double;
begin
// 獲取開始時間
clock_gettime(CLOCK_MONOTONIC, @StartTime);

// 你的程式碼塊
Sleep(1); // 示例延時,替換為你的程式碼

// 獲取結束時間
clock_gettime(CLOCK_MONOTONIC, @EndTime);

// 計算耗時(微秒)
Elapsed := (EndTime.tv_sec - StartTime.tv_sec) * 1e6 + (EndTime.tv_nsec - StartTime.tv_nsec) / 1e3;
WriteLn('Elapsed time: ', Elapsed:0:2, ' µs');
end.

Windows 平臺示例(浮點微秒)
program HighPrecisionTimerWindows;

{$mode objfpc}{$H+}

uses
Windows, SysUtils;

var
Frequency: Int64;
StartCount, EndCount: Int64;
Elapsed: Double;
begin
QueryPerformanceFrequency(Frequency); // 獲取計時器頻率
QueryPerformanceCounter(StartCount); // 開始計時

// 你的程式碼塊
Sleep(1); // 示例延時,替換為你的程式碼

QueryPerformanceCounter(EndCount); // 結束計時

// 計算耗時(微秒)
Elapsed := (EndCount - StartCount) * 1e6 / Frequency; // 計算耗時(微秒)
WriteLn('Elapsed time: ', Elapsed:0:2, ' µs');
end.

相關文章