C++ 从数组中检索值是否比仅访问数组更快地保存在temp变量中?

C++ 从数组中检索值是否比仅访问数组更快地保存在temp变量中?,c++,arrays,C++,Arrays,我需要为树莓Pi编写一个高度优化的程序。75%的OCed CPU(总共900 Mhz)已经被使用,我的代码可能不是最后一部分 程序需要在一个循环中多次访问数组中的相同数据。我知道提取值并放入临时变量更具可读性。但它是否加快了处理速度/减少了查找的CPU时间 如果有什么改变的话,我会直接在Raspberry Pi(模型B)上编译和构建。该项目使用基于内核3.2.27的定制Linux分支。Gcc/g++信息(相同结果): 这很可能会被优化掉。但请记住,由于处理器缓存的原因,访问存储在内存中的数据更便

我需要为树莓Pi编写一个高度优化的程序。75%的OCed CPU(总共900 Mhz)已经被使用,我的代码可能不是最后一部分

程序需要在一个循环中多次访问数组中的相同数据。我知道提取值并放入临时变量更具可读性。但它是否加快了处理速度/减少了查找的CPU时间

如果有什么改变的话,我会直接在Raspberry Pi(模型B)上编译和构建。该项目使用基于内核3.2.27的定制Linux分支。Gcc/g++信息(相同结果):


这很可能会被优化掉。但请记住,由于处理器缓存的原因,访问存储在内存中的数据更便宜。

首先,一个巨大的警告


还没有瓶颈,它仍然是WIP,但我希望在过程的早期避免瓶颈,这样我就不必在部署阶段/部署代码之后清除它们。不管怎样,优化代码或扩展知识都没有坏处

优化代码无疑会带来伤害。您所做的是“过早优化”。性能当然是一个代码度量,有时是最重要的。然而,为性能而优化的代码往往会减少构成“好代码”的几乎所有其他指标:可理解性、可移植性、可维护性、可测试性等。在您知道需要这样做之前,不要进行优化

您还询问了一个小优化。一个更大的算法:假设你的算法是O(N2),文献中有一个O(N*log(N))算法做了完全相同的事情。您可以将O(N2)优化到完全不可读、不可维护、不稳定的状态,并看到性能的微小提升。或者您可以切换到O(N*log(N))算法,并获得干净、可维护的代码


也就是说,是的,把事情放在局部变量中会有帮助,但也会有伤害。有时,编译器会将这些多个数组访问优化为一个临时的、编译器发明的变量。如果是这种情况,那么这些局部变量只是噪声,可能会使编译器感到困惑,并使生成的代码变慢

有时编译器不会优化这些多个数组访问。当它无法优化这些访问时,将内容存储到局部变量会有所帮助。不要猜测编译器。看看它在做什么


使用局部变量还有另一种方法。防止编译器优化同一数组元素的多次访问的一个因素是使用多个指针。编译器不知道
foo[index1]
是否指向与
bar[index2]
相同的内存位置。假设您在访问
foo[index1]
之间写入
bar[index2]
。编译器无法优化对
foo[index1]
的第二次访问,因为该值可能已更改

最好是以某种方式向编译器保证,
foo
指向的内存没有别名。C标准提供了
restrict
关键字来实现这一点。如果这是C,您可以使用
restrict
限定
foo
,从而使编译器能够将对
foo[index1]
的多次访问优化为一次


一个小问题: >限制关键字不是C++(还)。但是,gcc(还有clang)提供了

\uuuuu restrict\uuuu
关键字来做同样的事情。

两者都是固定时间。这真的是瓶颈吗?如果您的内存是统一的,那么所有内存都是相同的。还没有瓶颈,它仍然是WIP,但我希望在过程的早期避免瓶颈,这样我就不必在部署阶段/部署代码之后清除它们。不管怎样,优化代码或扩展知识都没有坏处。你说的是一个值(不管你如何访问它,编译器都可能移动到一个寄存器),还是几个值?@lee或者它是2*20个值(目前)。不是很多,我知道。
$ gcc -v
[...]
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)