⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpucounter_hss.pas

📁 很不错的非线性回归分析程序
💻 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 + -