QueryPerformanceCounter为什么和GetTickCount的结果相差很大

pencil_010 2009-07-23 04:04:37
一个很简单的小函数,看GetTickCount,clock,QueryPerformanceCounter这三个函数得到的结果。说明一下前提条
件,我是在复制一个303字节大小的文件来测试时间的;通过QueryPerformanceFrequency函数,可以得到我的机器上每秒频率值为3579545,这说明两点:1. 我的机器上高精确度性能计数器可用; 2. 高精确度性能计数器的精度可以达到微秒级。由于另外两个函数都是毫秒级的结果,所以这里把QueryPerformanceCounter的结果也转换为毫秒级:
void test1()
{
DWORD start = 0;
DWORD end = 0;
clock_t c_start, c_end;

LARGE_INTEGER freqc = {0};
LARGE_INTEGER llStart = {0};
LARGE_INTEGER llEnd = {0};
BOOL ret;

QueryPerformanceFrequency(&freqc);
DEBUG("frequence is %lld\n",freqc.QuadPart);

start = GetTickCount();
c_start = clock();
ret = QueryPerformanceCounter(&llStart);
system("copy 4.txt 4.txt.bak");
end = GetTickCount();
c_end = clock();
ret = QueryPerformanceCounter(&llEnd);

DEBUG("\nruns for %ld, start = %ld, end = %ld\n", end - start,

start, end);
DEBUG("\nruns for %ld, start = %ld, end = %ld\n", c_end - c_start,

c_start, c_end);
DEBUG("\nruns for %lld, llStart = %lld, llEnd = %lld\n",
((llEnd.QuadPart - llStart.QuadPart)*1000)/freqc.QuadPart,

llStart.QuadPart, llEnd.QuadPart);

}

函数GetTickCount和clock得到的结果也差不多,误差最多不超过1毫秒。但是同样就在后面执行的QueryPerformanceCounter函数,统计出来的结果会和前两个最多相差10毫秒。

不是说QueryPerformanceCounter应该更加精确吗?怎么和其它函数差那么远?它们的计时机制是什么?哪种比较靠谱?
...全文
958 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pencil_010 2009-07-24
  • 打赏
  • 举报
回复
谢谢arong的回复,我有空再试一下
pencil_010 2009-07-24
  • 打赏
  • 举报
回复
一开始就是分开来测试的,前两个函数的结果都会相差很大,我自己的理解是由于不同的测试函数运行时,系统环境不一样,导致每个函数的结果都不一样,感觉分开来测更不准确。所以我才把他们放在一起的,我以为差也差不到哪里去
slblake 2009-07-23
  • 打赏
  • 举报
回复
QueryPerformanceCounter这个函数的优先级为0,另外两个的优先级未知,不同优先级函数计算出来的值存在偏差,应该是可以理解的,按照理解,QueryPerformanceCounter这个函数计算出来的值应该要小一点的吧。
ps:楼主既然要做到这么精确,就不要把三个函数都放一起测试,构造三个相同条件的测试代码环境,我想不难吧。
arong1234 2009-07-23
  • 打赏
  • 举报
回复
以射箭为例子,精确度表示射的箭的集中程度,准确度表示箭离靶心的距离,精确度高的准度不一定高。一个每次都恰好射脱靶到靶底下的人,精确度极佳,但是准度可怜。

以楼主的代码为例,我估计gettickcount和clock的值的来源都来自时钟,所以可能比较接近,而另外一个则来自performance counter,所以由于来源不同,结果不同毫不奇怪

首先我同意taodm的观点,这种测量一点都不靠谱。你这种测量受外部影响的因素太多了,噪声可能超过了你要测量的东西。

1. 如果中间有线程切换,你的时间就必然受影响
2. 如果执行过程中切换到其他cpu,QueryPerformanceCounter根本就靠不住(MSDN这么说的)

也就是说:你拿了两把都靠不住的尺子,尺子A用方法1和方法2去测量,结果接近,尺子B用方法3测量,结果和1,2的结果差别很大。你说三个结果哪个对?

在多任务系统中,你一个操作的时间假如很短,就无法准确测量,因为系统管理的时间已很接近它了。如果你要测量,至少把文件搞个303MB还差不多。
pencil_010 2009-07-23
  • 打赏
  • 举报
回复
咳咳,我就是想搞明白这个代码为什么结果不是我想象中的那样,如果我这里混淆了“精确度和准确度”,那不好意思了,但是,这个问题,好像没啥结果哈,大牛出现教教我啊~~~
aistudies 2009-07-23
  • 打赏
  • 举报
回复
精确度和准确度是2个完全不同的物理学概念。


--------------------
为什么是物理学概念?
难道除了物理其他地方都不能用这个概念
taodm 2009-07-23
  • 打赏
  • 举报
回复
精确度和准确度是2个完全不同的物理学概念。
在业余级测试环境下,它们都不靠谱。
大前置 2009-07-23
  • 打赏
  • 举报
回复
帮顶

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧