通过索引访问向量的速度:向后与向前

时间:2015-04-09 14:44:11

标签: c++

由于缓存效应,向量的前向迭代将比(例如)随机访问更快:

for (unsigned i=0; i<vec.size(); i++) {
    vec[i] = something(i); 
}

现在我需要向后迭代它:

for (unsigned i=vec.size(); i-->0; ) {
    vec[i] = something(i);
}

在我的系统上似乎没有速度差异。我可以假设相同的缓存效果适用于此,因此循环在大多数系统上具有相同的速度吗?

1 个答案:

答案 0 :(得分:4)

对硬件进行假设几乎总是一个糟糕的选择 - 除非您考虑到特定的硬件子集。 如果您希望代码在现代x86硬件(例如Windows 8台式机)上几乎完全运行,那么可以假设此反向迭代在速度上是等效的(通常为reverse_iterators

但是,如果您的目标是移动技术,嵌入式系统或旧系统,那么可以预期的差异就会大得多。

就个人而言,我花了四年时间为台式机开发商用优化软件 - 在那段时间我从未需要优化矢量迭代

如果您发现自己在平台上分析软件,并发现在这方面需要优化 - you may be better allocating an array and manually iterating over the elements。 然而,在您的开发早期,这种优化往往过于热心。

毫无疑问,您可以创建自己的迭代器类,向量或数组类,以便在特定情况下提供更快的迭代。但这样做会使代码变得非常复杂 - 在调试代码时最终会导致问题。

  

“调试的难度是首先编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法对其进行调试。“~Brian Kernighan

我个人推荐除非你有一个目标平台集的例子,你打算部署到那个是异常的,或者有一个特定的场景,你可以产生速度差异的证据。假设标准库矢量适当快。

也就是说,根据您希望执行的工作量,如果您拥有非常大量的数据,您可能会发现std :: list更合适;请参阅以下链接: Benchmarks of STL containers