C++(STL)容器处理大量数据时的遍历操作,代码效率情况如何,今天做一个系统的效能测试,对比不同的遍历访问方法对效率的影响。值得注意的是,容器遍历这种底层操作,往往对上层高度封装后的代码效率产生巨大影响,不可忽视。
我们选用最简单的std::vector容器作为测试目标。先看下测试代码:
void main() {
std::vector<byte> tagv; //为节约内存选用一个byte数据类型,类型的不同对测试结果并无影响。
size_t sit = 10000 * 10000 * 1; //单个类型的测试总数,执行1亿次遍历操作。
tagv.resize(sit,1);
size_t aaa = 0;
CLTick tk; //CLTick 是一个超高精度的计时器,用于记录遍历操作所用时间。
//方式1:下标访问,多次计算上限。以下简称:[] 方式。
tk.timingStart();
for (size_t i = 0; i < tagv.size(); ++i)
aaa += tagv[i]; //为避免在Release模式下将无效用的变量优化掉,采用一个简单的+操作。
double ss0 = tk.getSpendTime();
//方式2:下标访问,单次计算上限。以下简称:[](Single) 方式。
tk.timingStart();
for (size_t i = 0,ie = tagv.size(); i < ie; ++i)
aaa += tagv[i];
double ss1 = tk.getSpendTime();
//方式3:迭代器访问,前向自加,多次计算上限。以下简称:++i 方式。
tk.timingStart();
for (auto i = tagv.begin(); i != tagv.end();