为何std::find_if仅在Intel CPU上能大幅提升函数性能?
Intel CPU上std::find_if与手写循环的性能差异解析
现象概述
将下述手写范围循环的函数改用std::find_if实现后,仅在Intel CPU上性能提升约2倍,但在AMD、Apple CPU上性能提升仅为10%-20%,甚至无明显提升。该现象在g++、clang++、MSVC等多款编译器中表现一致。
原手写循环函数
bool process_update_range_based(int treeId, int newHeight, bool tall, std::vector<HeightRecord>& vec, std::vector<int>& updateSet) { for (auto &hr : vec) { if (hr.treeId == treeId) { if (hr.height == newHeight) return false; else { hr.height = newHeight; updateSet.push_back(treeId); return true; } } } vec.emplace_back(treeId, newHeight, tall); return true; }
测试说明
- 测试方式:模拟10次运行,统计N次迭代的平均耗时与最小耗时(最小耗时数据可信度最高,浏览器环境下测试值波动较大)
- 编译参数:
-O3 -march=x86-64-v3
性能测试数据
| CPU | for循环平均耗时 | find_if平均耗时 | for循环最小耗时 | find_if最小耗时 |
|---|---|---|---|---|
| Godbolt GenuineIntel | N/A | N/A | 0.0275 | 0.0136 |
| Godbolt AuthenticAMD | N/A | N/A | 0.0245 | 0.0212 |
| Apple M2 | 0.0258 | 0.0235 | 0.0216 | 0.0216 |
| AMD 5600H | 0.0288 | 0.0287 | 0.0244 | 0.0217 |
| Intel i5-1335U | 0.0294 | 0.0152 | 0.0223 | 0.0125 |
关键疑点
令人困惑的是,两种实现对应的汇编代码仅包含简单的移动与比较操作,但只有用std::find_if替代手写范围循环时,Intel CPU才会出现显著性能提升。
更新补充:std::array版本测试
改用std::array的测试结果整体趋势与std::vector一致,但std::array的测试结果受执行顺序影响更大。
核心问题
- 是什么导致了这种跨CPU的性能差异?
- Intel CPU有何特殊设计,使得同款汇编代码的执行速度比AMD/Apple CPU快2倍?
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

