求助:C++中计算执行时间始终得到0的问题
解决C++程序计时始终返回0的问题
嘿,我之前也踩过这个一模一样的坑!这种不管输入规模多大,计时结果都是0的情况,基本逃不开这几个原因,给你一步步拆解解决:
为什么会出现这种情况?
- 代码执行太快:
chrono或者ctime的默认时钟精度是有限的(比如很多系统的时钟分辨率是1毫秒),如果你的核心计算只花了0.1毫秒,计时器就会直接显示0。 - 编译器优化“吃掉”了计算:如果你的计算结果没有被实际使用(比如只是算完就扔了,没输出、没存到全局变量里),聪明的编译器会直接把这段计算代码删掉——相当于这段代码根本没执行,耗时自然是0。
- 计时范围没选对:比如你把计时起点放在了输入之前,终点放在了输入之后,但其实核心计算的时间占比极低,或者你不小心把空代码段当成了测量对象。
具体的解决办法
1. 循环多次放大执行时间
把你要测量的核心代码重复执行N次,最后把总时间除以N得到单次耗时。这样哪怕单次只花0.1毫秒,循环1000次就有100毫秒,计时器就能捕捉到了:
#include <chrono> #include <iostream> int main() { const int iterations = 10000; // 可以根据你的代码耗时调整次数 auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < iterations; ++i) { // 把你的核心计算代码放在这里 // 比如:your_heavy_calculation(); } auto end = std::chrono::high_resolution_clock::now(); auto total_duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "单次执行耗时:" << total_duration.count() / (double)iterations << " 微秒" << std::endl; return 0; }
2. 确保计算结果被“真正使用”
编译器会优化掉没有副作用的代码,所以得让计算结果被用到——比如打印出来、赋值给全局变量,或者作为函数返回值被接收:
// 错误示例:计算结果没被使用,大概率会被优化掉 void bad_compute() { int sum = 0; for (int i = 0; i < 100000; ++i) sum += i; } // 正确示例:让结果被实际使用 int good_compute() { int sum = 0; for (int i = 0; i < 100000; ++i) sum += i; return sum; } int main() { auto start = std::chrono::high_resolution_clock::now(); int result = good_compute(); auto end = std::chrono::high_resolution_clock::now(); // 必须用一下result,比如打印出来,不然还是可能被优化 std::cout << "计算结果:" << result << std::endl; auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "执行耗时:" << duration.count() << " 微秒" << std::endl; return 0; }
别用volatile来强行阻止优化,这不是规范做法,最好还是让结果有实际用途。
3. 用最高精度的时钟
确保你用的是std::chrono::high_resolution_clock,这是C++标准里精度最高的时钟。别用std::chrono::system_clock,它的精度通常更低,而且还会受系统时间调整的影响。
4. 只给核心计算计时
如果你的程序有输入输出(比如读文件、打印日志),这些操作的耗时可能远大于计算时间,或者你可能误把IO时间算进去了。一定要把计时的起点和终点精准包裹住核心计算部分,别把IO操作包含进去。
额外的小检查
- 如果你用的是
ctime的clock()函数,记得要把返回值除以CLOCKS_PER_SEC才能得到秒数,但clock()的精度确实不如chrono,而且可能受多线程影响,优先用chrono更靠谱。 - 注意编译模式:调试模式(Debug)下编译器会关闭很多优化,这时候计时可能正常,但发布模式(Release)下优化全开,就容易出现计时为0的情况——所以测试计时的时候最好用Release模式,更贴近实际运行情况。
内容的提问来源于stack exchange,提问作者Mhaalazri
相关产品推荐
相关产品推荐

