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,
指令预测等.
------解决思路----------------------
空循环应该被优化掉才对。
------解决思路----------------------
引用:系统问题吧,这几个回帖都重复了,难道大家都有病?!
优快云现在连一个论坛都维护不好了?
------解决思路----------------------
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
------解决思路----------------------
QueryPerformanceCounter运算也是需要时间的,所以你不应该用1和1000比,至少也是1000和10000比。
------解决思路----------------------
0.001400(ms)
0.004666(ms)
这种数据根本没有意义,相对误差太大了。
要想得出什么结论,至少也要让二者的时间都达到秒级。
------解决思路----------------------
因为CPU不会一直都在跑你的代码。为了实现多任务,CPU要不断在不同的线程之间切换,所以不能保证你的代码第二次执行的时候还是在同一个时间片里。毕竟Windows不是实时系统,不要太纠结这些,ms级别的精度就够了。
------解决思路----------------------
时间片给当前进程的非陪,编译器对循环做计数寄存器的优化, cpu现场保存,cpu现场恢复, 执行时运行的进程数,就绪的进程数,计时函数的 压栈 出栈,计时函数的 运算时间点,循环内的 运算量
这些都会影响 运行的最终时间
------解决思路----------------------
15楼说的有道理。楼主要让代码重复执行一定次数求平均耗时,再下结论