C++ for循环性能测试疑问:Debug与Release模式结果不同的原因?
C++范围for循环性能测试疑问与问题分析
我的疑问
for(auto)与for(auto &)的性能差异- 拆分for循环的性能影响
for(auto &)与for(const auto &)的性能差异for(int : list)与for(auto : list)的性能差异(list为int类型vector)
测试结果
Debug模式(无优化)
// In debug mode 1. elapsed: 7639 (1663305922550 - 1663305914911) 2. elapsed: 3841 (1663305926391 - 1663305922550) 3. elapsed: 3810 (1663305930201 - 1663305926391)
Release模式(GCC -O3优化)
// release mode 1. elapsed: 0 (1663305408984 - 1663305408984) 2. elapsed: 0 (1663305409984 - 1663305409984) 3. elapsed: 0 (1663305410984 - 1663305410984)
我不确定是测试方法有误,还是优化状态不同导致结果无差异属于正常情况?恳请指出测试中存在的问题。
测试源码
测试向量构建与核心测试代码
// create test vector const uint64_t max_ = 499999999; // 499,999,999 std::vector<int> v; for (int i = 1; i < max_; i++) v.push_back(i); // test 1. auto start1 = getTick(); for (auto& e : v) { auto t = e + 100; t += 300; } for (auto& e : v) { auto t = e + 200; t += 300; } auto end1 = getTick(); // test 2. // Omit tick function for (auto& e : v) { auto t1 = e + 100; t1 += 300; auto t2 = e + 200; t2 += 300; } // test 3. for (auto e : v) { auto t1 = e + 100; t1 += 300; auto t2 = e + 200; t2 += 300; } ...
计时函数实现
uint64_t getTick() { return (duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count()); }
测试环境
- 平台:Jetson Xavier NX(JetPack 4.6,Ubuntu 18.04LTS)
- 架构:aarch64
- 内存:8GB RAM
- 编译器:GCC 7.5.0
问题分析与测试缺陷
1. 编译器优化消除无意义代码
Release模式下-O3优化会彻底移除无副作用的代码:你的测试循环仅对临时变量做运算,但这些变量的值从未被使用(无输出、无全局状态修改、无内存写入)。编译器直接删除了整个循环,所以计时结果为0,这是正常的优化行为。
要让测试有效,必须让循环操作产生可观测副作用,比如:
- 将计算结果写入全局变量
- 把结果存入另一个vector
- 对
volatile变量进行操作
2. 测试覆盖不完整
现有测试仅覆盖了2项疑问(拆分循环、auto vs auto&),未涉及:
auto&vsconst auto&:Debug模式下两者性能几乎无差异,Release优化后完全一致(const仅为语法约束,不影响内存访问方式)for(int : list)vsfor(auto : list):对于vector<int>,auto会推导为int,两者本质完全相同,无论Debug还是Release都不会有性能差异
3. 计时精度不足
使用毫秒级计时对极快操作或被优化的代码精度不够,建议改用微秒(microseconds)或纳秒(nanoseconds)计时,同时多次运行测试取平均值,降低系统调度带来的误差。
4. Debug模式差异的原因
Debug模式无任何优化:
- 拆分循环的测试1需要遍历vector两次,耗时约为单次遍历的两倍(7639 vs 3841),符合预期
auto e会复制vector中的每个int元素,但int是小类型,复制开销极小,所以测试2和3的耗时接近(3841 vs 3810)
内容的提问来源于stack exchange,提问作者mystes
相关产品推荐
相关产品推荐

