使用C++ chrono库测量操作块运行时间始终显示0的问题咨询
为什么你的chrono计时输出始终为0?
嘿,我之前也踩过这个坑!你的代码语法上完全没问题,但输出0通常是下面两个常见原因导致的:
1. 目标操作耗时太短,超出了时钟的可测量精度
high_resolution_clock虽然是C++标准里精度最高的时钟,但它也有最小可测量的时间间隔(取决于你的硬件和操作系统)。如果你的// operations部分只是空代码或者极简单的计算(比如几纳秒就能完成),那么end - begin的差值会小于时钟的最小刻度,duration_cast转换后就会得到0。
2. 编译器优化把你的操作“吃掉”了
如果你的operations没有任何副作用(比如没有修改全局变量、没有IO操作、计算结果也没被后续代码使用),编译器在O2/O3等优化级别下会直接把这段代码彻底删除——毕竟留着它对程序功能没有任何影响,还能提升运行速度。没有了实际操作,计时自然就是0了。
解决办法
针对这两个问题,你可以试试下面的方案:
给操作添加“防优化”的副作用:
比如用volatile变量接收计算结果,或者把结果用于IO操作,让编译器没法轻易删掉你的代码:#include <iostream> #include <chrono> using namespace std; using namespace chrono; int main() { volatile int dummy; // 标记变量为易变,防止编译器优化 auto begin = high_resolution_clock::now(); // 替换成你的实际操作,这里举个循环计算的例子 int result = 0; for (int i = 0; i < 100000; ++i) { result += i * i; } dummy = result; // 强制保留计算结果,避免操作被优化 auto end = high_resolution_clock::now(); auto elapsed = duration_cast<nanoseconds>(end - begin); cout << "time: " << elapsed.count() << endl; return 0; }重复执行操作以累积耗时:
如果你的操作本身确实极快,那就把它放在循环里执行成千上万次,计算总耗时后再除以次数得到单次耗时,这样结果会更准确,也不会出现0的情况。检查编译器优化级别:
Debug模式下优化通常是关闭的,你可以先在Debug模式下测试,如果输出非0值,那就说明是Release模式的优化导致操作被删除了,这时候就需要用上面的防优化方法。
内容的提问来源于stack exchange,提问作者ktoś tam
相关产品推荐
相关产品推荐

