我将尝试通过调用QueryPerformanceCounter(QPC)来测量串行协议握手的响应时间。我的目标系统是一台装有Win7操作系统的Asrock D1800b Intel双核计算机,并使用MinGw的最新版本进行编译(6.3.0-1)。
为了测试QPC,我有以下代码:
当在目标系统上运行时,我得到如下结果:(没有其他负载)
经过时间=5341 经过时间=14086 经过时间=13818 经过时间=14322 经过时间=15305 经过时间=8867 经过时间=12162 经过时间=14225 经过时间=13333 经过时间=14751
但是当在开发系统(Win10,Intel i5)上运行时,我得到了更加一致的结果:
经过时间=11326 经过时间=11556 经过时间=12630 经过时间=11583 经过时间=11749 经过时间=12644 经过时间=12562 经过时间=11690 经过时间=11726 经过时间=11664
以上两个结果都是大量运行的示例。
预期结果应该在10000微秒以上。
那么,有什么想法可以解释目标系统上发生了什么?
为了测试QPC,我有以下代码:
#include <windows.h>
#include <stdio.h>
void main()
{
//performance timers
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
for (int i = 0 ; i < 10 ; i++)
{
QueryPerformanceCounter(&StartingTime);
Sleep(10); //ms
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000; //first scale up counts
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart; //then convert to us
printf("elapsed=%li\n", ElapsedMicroseconds.QuadPart);
}
}
当在目标系统上运行时,我得到如下结果:(没有其他负载)
经过时间=5341 经过时间=14086 经过时间=13818 经过时间=14322 经过时间=15305 经过时间=8867 经过时间=12162 经过时间=14225 经过时间=13333 经过时间=14751
但是当在开发系统(Win10,Intel i5)上运行时,我得到了更加一致的结果:
经过时间=11326 经过时间=11556 经过时间=12630 经过时间=11583 经过时间=11749 经过时间=12644 经过时间=12562 经过时间=11690 经过时间=11726 经过时间=11664
以上两个结果都是大量运行的示例。
预期结果应该在10000微秒以上。
那么,有什么想法可以解释目标系统上发生了什么?
Sleep()
无法保证确切的延迟执行时间。您会尽力而为,但仅此而已。QueryPerformanceCounter()
相当准确,但如果我可以打个比方,你现在做的就像是用千分尺来测量用斧头手工切割的木材大小一样。 - dgnuff