感觉用API函数GetTickCount比较方便。
我的程序是这样的
var t0,TimeTaken:DWORD;
begin
t0:=GetTickCount;
//
//要测量时间的程序段
//
TimeTaken:=GetTickCount-t0;
end;
这样就把程序段的执行时间(ms)存放在TimeTaken中了。
但是用多了发现有个问题,每次我得到的TimeTaken都是能被10整除,开始还以为是巧合,到后来发现所有的测量结果TimeTaken都是50ms,20ms,10ms,如果要测量的执行时间少于10ms测量结果TimeTaken都等于0,根本得不到正确结果。
经测量调试发现GetTickCount能得到不被10整除的毫秒数。
那么这个方法到底问题在哪儿呢?
我的程序是这样的
var t0,TimeTaken:DWORD;
begin
t0:=GetTickCount;
//
//要测量时间的程序段
//
TimeTaken:=GetTickCount-t0;
end;
这样就把程序段的执行时间(ms)存放在TimeTaken中了。
但是用多了发现有个问题,每次我得到的TimeTaken都是能被10整除,开始还以为是巧合,到后来发现所有的测量结果TimeTaken都是50ms,20ms,10ms,如果要测量的执行时间少于10ms测量结果TimeTaken都等于0,根本得不到正确结果。
经测量调试发现GetTickCount能得到不被10整除的毫秒数。
那么这个方法到底问题在哪儿呢?
var i,j,beginTime,endTime : Integer;
begin
beginTime := GetTickCount;
for i := 0 to 1000000 do
begin
for j := 0 to 1000 do
begin
end;
end;
endTime := GetTickCount;
Edit1.Text := IntToStr((endTime - beginTime));
end;
gettickcount一般为10ms
如果想再精确可以用
QueryPerformanceCounter还有
_int64 Count(void)
{
_asm _emit 0x0F
_asm _emit 0x31
}
//返回CPU从上次重启到现在经历的周期数 _int64 start=Count();
//在这里添加你的代码。
_int64 stop=Count();
EXPORTFUNC void startcheck(DWORD* freq,DWORD* OldTime)
{ //DWORD Frequence,old,now;
QueryPerformanceFrequency(&(union _LARGE_INTEGER)Frequency);
*freq=Frequency.QuadPart;
QueryPerformanceCounter(&(union _LARGE_INTEGER)TOld);
*OldTime=TOld.QuadPart;
}EXPORTFUNC float TestTime(DWORD* NowTime)
{ //DWORD Frequence,old,now;
float UsedTime;
QueryPerformanceCounter(&TNow);
UsedTime=(TNow.QuadPart-TOld.QuadPart)/Frequency.QuadPart;
return(UsedTime);
}
编译通过。我再把TestTime.dll拷贝到D:\TestTime.dll在Delphi里我声明
implementation
procedure startcheck(var freq:DWORD;var OldTime:DWORD);external'D:\TestTime.dll';
function TestTime(var NowTime:DWORD):Real;cdecl;external'TestTime.dll';
按F9编译又通过!然后在程序里加上
var
freq,OldTime,NowTime:DWORD;
...
StartCheck(freq,OldTime);以测量时间
可再每次按F9运行时总是无法运行(程序刚刚起动就进入单步运行状态)去掉调用就可以了
大家来帮个忙呀!
上面缺少一个名为Msvcrtd.dll的文件