为何Google Benchmark测试中array耗时接近0ns,性能远高于std::vector
性能差异的核心原因是编译器对两段代码的优化程度完全不同,本次基准测试结果失真,没有真实反映原生数组和std::vector的实际性能差距
1. 原生数组的测试逻辑几乎被编译器完全优化消除
你定义的int a[200][200]是栈上连续内存数组,后续仅读取了a[2][89]的值,这个值等于2*89=178,是编译期就能确定的常量。编译器会直接判定整个数组的初始化、循环赋值逻辑都没有对外副作用,直接把这些代码全部删除,最终整个测试函数只需要执行给t赋值178的操作,耗时无限接近0,才会出现几乎无开销的测试结果。
2. std::vector的逻辑无法被完全优化消除
std::vector的内存是在堆上申请的,构造、析构函数都包含内存申请、释放的操作,属于有对外副作用的逻辑,编译器无法直接将整个vector的创建、赋值逻辑全部删除,只能实实在在执行嵌套vector的内存申请、循环赋值、内存释放的完整流程,自然耗时会高很多。
另外你使用的是嵌套std::vector<std::vector<int>>结构,内层的每一个vector都会单独申请堆内存,内存不连续,本身执行开销也比栈上连续存储的原生数组更高,但这不是本次测试出现夸张倍率的核心原因。
3. 测试本身存在设计缺陷
这个2900000000倍的结果完全没有参考意义,属于基准测试没有阻止编译器死代码消除导致的失真。如果要正确测试两者的读写性能,你需要对测试逻辑做防止优化处理,比如将计算结果通过benchmark::DoNotOptimize传递给基准测试框架,避免编译器判定逻辑无用直接删除。
内容的提问来源于stack exchange,提问作者崔志强
相关产品推荐
相关产品推荐

