该声明
a[i] += a[j] * a[k];
将在可能执行数千到数百万次的循环中执行数千次。表示对 中的条目的随机访问的索引i
、j
和可以由语句设置k
a
i = i_index[l];
j = j_index[l];
k = k_index[l];
哪里l
是for
循环的索引。整数数组i_index
, j_index
, 和k_index
是在程序开始时设置的,可能偶尔会更改。
内存指针数组是另一种选择。例如
*ap1[l] += *ap2[l] * (*ap3[l]);
其中内存指针数组ap1
、ap2
和ap3
被预先设置为指向最初由 、 和 数组标识i_index
的j_index
位置k_index
。它们也可能偶尔更改。
第一种方法看起来比第二种方法更干净,但它似乎更慢,除非有某种方法可以向编译器提供额外的信息。似乎 XCode 中的 GCC 编译器无法提前发现i_index
, j_index
, 和k_index
or ap1
, ap2
, 并且ap3
大部分时间是不变的。有什么方法可以提醒 gcc 编译器以提高性能?