该声明
a[i] += a[j] * a[k];
将在可能执行数千到数百万次的循环中执行数千次。表示对 中的条目的随机访问的索引i、j和可以由语句设置ka
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_indexor ap1, ap2, 并且ap3大部分时间是不变的。有什么方法可以提醒 gcc 编译器以提高性能?