?? cpucounter_hss.pas
字號:
unit CPUCounter_Hss;
//////////////////////////////////////////////////////////////
// //
// CPU周期、時間計算操作庫 作者:侯思松 2002年。 //
// //
//////////////////////////////////////////////////////////////
interface
uses SysUtils;
{ CPU周期計算操作庫 (不支持486及以下CPU) :
獲取當前CPU周期計數;或者獲取當前時間計數
利用兩次調用的差值就可以知道代碼段的執行時間,
精度有可能達到CPU指令周期 }
Procedure StopIf(const bValue:Boolean=True); {條件斷點,調試時當參數為Ture時暫停程序,比如:StopIf(i>=100);}
function CPUCycleCounter():int64 register; {獲取當前CPU周期計數(CPU周期數)}
function CPUTimeCounter():Extended; {獲取當前時間計數(us),利用CPU內部指令完成}
function CPUTimeCounterQPC():Extended; {獲取當前時間計數(us),利用高性能計數器完成}
function GetCPUFrequency():int64;overload; {獲得CPU的主頻,準確快速}
function GetCPUFrequency(const dTime:integer):int64;overload;{獲得CPU的主頻,準確度與dTime成正比,dTime單位為ms}
//============================================================================
function CPUCallInitialize():Boolean; {初始化,成功返回True,失敗返回False}
var CPUCycle0 :int64=0; {CPU周期計數}
QPCounter0 :int64=0; {高性能計數器計數}
QPCFrequency :int64=0; {高性能計數器頻率}
CPUFrequency :int64=0; {CPU頻率}
//============================================================================
{外部API調用}
function QueryPerformanceCounter(var lpPerformanceCount: int64): LongBool; stdcall;
{$EXTERNALSYM QueryPerformanceCounter}
function QueryPerformanceFrequency(var lpFrequency: int64): LongBool; stdcall;
{$EXTERNALSYM QueryPerformanceFrequency}
//============================================================================
implementation
Procedure StopIf(const bValue:Boolean=True);{調試時當參數為Ture時暫停程序,比如:DebugStop(i>=100);}
begin
//{$IFDEF DEBUG}
if bValue then
begin
asm
int 3
end;
end;
//{$ENDIF}
end; { 壓F8或F7到條件斷點處 }
function CPUCallInitialize():Boolean;{初始化,成功返回True,失敗返回False}
begin
try
CPUCycle0:=CPUCycleCounter;
QueryPerformanceCounter(QPCounter0);
QueryPerformanceFrequency(QPCFrequency);
CPUFrequency:=GetCPUFrequency(100);{獲得當前CPU的主頻}
result:=true;
except
result:=false;
end;
end;
function CPUTimeCounter():Extended;{獲取當前時間計數(us),利用CPU內部指令完成}
var t1:int64;
begin
try
t1:=CPUCycleCounter();
result:=(t1-CPUCycle0)*1.0*1000000.0/GetCPUFrequency(); //返回微秒
except
result:=-1.0;
end;
end;
function CPUTimeCounterQPC():Extended;{獲取當前時間計數(us),利用高性能計數器完成}
var t1:int64;
begin
try
QueryPerformanceCounter(t1);
result:=(t1-QPCounter0)*1.0*1000000.0/QPCFrequency; //返回微秒
except
result:=-1.0;
end;
end;
function CPUCycleCounter():int64 register;{獲取當前CPU周期計數(CPU周期數)}
asm
RDTSC {eax,edx}
end;
function GetCPUFrequency():int64;overload;{獲得CPU的主頻,準確快速}
var t1,t2:int64;
e1:Extended;
begin
try
QueryPerformanceCounter(t1);
t2:=CPUCycleCounter();
e1:=((t2*1.0-CPUCycle0*1.0)*QPCFrequency/(t1*1.0-QPCounter0*1.0));
result:= trunc(e1);
except
result:=-1;
end;
end;
function GetCPUFrequency(const dTime:integer):int64;overload;{獲得CPU的主頻,準確度與dTime成正比,dTime單位為ms}
var t0,t1,t2,t3,t4,t5:int64;
e1:Extended;
tmpdTime:integer;
begin
try
tmpdTime:=dTime;
if tmpdTime<1 then tmpdTime:=1;
QueryPerformanceCounter(t0);
t0:=CPUCycleCounter();
//
QueryPerformanceFrequency(t3);
QueryPerformanceCounter(t2);
t1:=CPUCycleCounter();
sleep(tmpdTime);
QueryPerformanceCounter(t4);
t5:=CPUCycleCounter();
//
e1:=((t5*1.0-t1*1.0)*t3/(t4*1.0-t2*1.0))*1.0;
result:= trunc(e1);
except
result:=-1;
end;
end;
//==============================================================================
{外部API調用}
function QueryPerformanceCounter; external 'kernel32.dll' name 'QueryPerformanceCounter';
function QueryPerformanceFrequency; external 'kernel32.dll' name 'QueryPerformanceFrequency';
//==============================================================================
initialization
//初始化
begin
CPUCallInitialize();
end;
//==============================================================================
{ CPU周期、時間計算操作庫 作者:侯思松 2002年。 }
{CPU周期、時間計算操作庫單元結束}
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -