C语言通过for循环控制计时,for语句耗时计算的一些纳闷

博客探讨了在C语言中使用for循环进行计时测试时,发现计时结果与循环次数并非简单的线性关系。讨论涉及到编译器优化、系统调用开销、指令流水线、多任务处理等因素对循环耗时的影响,并建议通过增加循环次数和计算平均值来提高测量准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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楼说的有道理。楼主要让代码重复执行一定次数求平均耗时,再下结论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值