繁体   English   中英

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

[英]Speed of accessing a vector by index: backwards vs forward

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

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

现在,我需要向后迭代:

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

在我的系统上,似乎没有速度差异。 我是否可以假定在这里应用相同的缓存效果,因此在大多数系统上循环的速度相同?

关于硬件的假设几乎总是一个糟糕的选择-除非您牢记特定的硬件子集。 如果您打算让代码几乎完全在现代x86硬件(例如Windows 8台式机)上运行,则可以假设此反向迭代的速度相同(通常与reverse_iterators相同 )。

但是,如果您针对移动技术,嵌入式系统或较旧的系统,则预期之间会有很大程度的差异。

就个人而言,我已经花了四年的时间为台式机商业开发优化软件-那时我从来不需要优化向量迭代

如果您发现自己在平台上对软件进行了性能分析,并发现在这方面需要优化, 则最好分配一个数组并手动迭代这些元素 但是,在您的开发初期,这样的优化往往过于热情。

毫无疑问,您可以创建自己的迭代器类,向量或数组类,以在您的特定情况下提供更快的迭代。 但是这样做会极大地使您的代码复杂化-最终会在调试代码时引起问题。

“调试的难度是一开始编写代码的两倍。 因此,如果您尽可能聪明地编写代码,那么就定义而言,您就不足以调试它。”〜Brian Kernighan

我个人建议,除非您有一个目标平台集的例子,否则您打算将其部署到异常的环境中,或者有一个特定的场景可以产生速度差异的证据。 假设标准库向量适当地快。

也就是说,根据您希望执行的工作量,如果您有大量数据,则可能会发现更合适的std :: list; 请参阅以下链接: STL容器基准

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM