软件注册站
热情软件屋

 
有何办法能够测到毫秒一级精度
编号: QA000995    
建立日期: 1999年5月16日 最后修改日期: 2004年8月25日
所属类别: C/C++ - DDK与硬件设备
   
    c++builder3.0
    win97
    有何办法能够测到毫秒一级精度?我要测试一个程序执行所用的时间,我用gettime()函数只能测到1/100秒的精度,不是十分精确,由于我正在做毕业设计,时间很紧迫,十分着急。(小张)
   
    gettime()得到的时间精度大约是55ms。如果要得到1ms左右的时间,必须利用Win API的timeGetTime函数,它得到的时间精度为1-10ms。如果想提高精度,可以使用QueryPerformanceCounter和QueryPerformanceFrequency。这两个函数不是在每个系统中都支持。对于支持它们的系统中,可以获得低于1ms的精度。Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。根据要延时的时间和定时器的频率, 可以算出要延时的时间定时器经过的周期数。在循环里用 QueryPerformanceCounter 不停的读出定时器值, 一直到经过了指定周期数再结束循环, 就达到了高精度延时的目的。这是目前可以得到的最高精度了。例子:
     int var1 = 2;
    
int i;
    
    
for (i = 0; i < INT_ARRAY_LEN; i++)
    
{
    
intarray[i] = i*5;
    
var1 += 2;
    
}
    
    
LARGE_INTEGER start, end;
    
LARGE_INTEGER freq;
    
    
SetThreadAffinityMask(GetCurrentThread(), 1);
    
QueryPerformanceFrequency(&freq);
    
QueryPerformanceCounter(&start);
    
double total = 0;
    
    
for (i = 0; i < 100000; i++)
    
{
    
total += intCalculate();
    
}
    
    
QueryPerformanceCounter(&end);
    
    
cout << "Total = " << total << endl;
    
    
cout << (end.QuadPart - start.QuadPart)/(double)freq.QuadPart << " seconds" << endl;
    

    对 SetThreadAffinityMask 的调用减少了多处理器计算机上的人工作业。

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, DDK与硬件设备, hardware, ddk, vtoolsd, driver studio, winrt

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio