for语句耗时计算的一些疑惑
最近测试了for语句执行耗时,先看代码
/********************计时代码1/3********************/
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
/********************计时代码1/3********************/
/********************计时代码2/3********************/
QueryPerformanceFrequency(&nFreq); //
QueryPerformanceCounter(&nBeginTime);
/********************计时代码2/3********************/
for( int i = 0; i
{
}
/********************计时代码3/3********************/
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)*(1000)/(double)nFreq.QuadPart;
printf("time = %f(ms)\n",time);
/********************计时代码3/3********************/
time = 0.001400(ms)
当我把for循环增加值1000时time = 0.004666(ms) 这个为什么不是简单的线性关系,里边有什么道道请大神讲解下
------解决思路----------------------
我猜那个空 for 都优化没了,看看汇编是不是这样。
------解决思路----------------------
1)最直接的办法是反编译,看汇编.
2)不知道你的取时间函数是怎么实现的,一般来说是一个系统调用来实现,系统调用的时间不是确定的.
3)一般来说,(for 100次的时间)比(for 1次时间*100)要短,原因有很多,比如指令流水线,cache,
指令预测等.
------解决思路----------------------
空循环应该被优化掉才对。
------解决思路----------------------
引用:系统问题吧,这几个回帖都重复了,难道大家都有病?!
CSDN现在连一个论坛都维护不好了?
------解决思路----------------------
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
------解决思路----------------------
QueryPerformanceCounter运算也是需要时间的,所以你不应该用1和1000比,至少也是1000和10000比。
------解决思路----------------------
0.001400(ms)
0.004666(ms)
这种数据根本没有意义,相对误差太大了。
要想得出什么结论,至少也要让二者的时间都达到秒级。
------解决思路----------------------
因为CPU不会一直都在跑你的代码。为了实现多任务,CPU要不断在不同的线程之间切换,所以不能保证你的代码第二次执行的时候还是在同一个时间片里。毕竟Windows不是实时系统,不要太纠结这些,ms级别的精度就够了。
------解决思路----------------------
时间片给当前进程的非陪,编译器对循环做计数寄存器的优化, cpu现场保存,cpu现场恢复, 执行时运行的进程数,就绪的进程数,计时函数的 压栈 出栈,计时函数的 运算时间点,循环内的 运算量
这些都会影响 运行的最终时间
------解决思路----------------------
15楼说的有道理。楼主要让代码重复执行一定次数求平均耗时,再下结论
博客探讨了在C语言中使用for循环进行计时测试时,发现计时结果与循环次数并非简单的线性关系。讨论涉及到编译器优化、系统调用开销、指令流水线、多任务处理等因素对循环耗时的影响,并建议通过增加循环次数和计算平均值来提高测量准确性。

5926

被折叠的 条评论
为什么被折叠?



