在我的一个JAVA
项目中,我通常必须将巨大的数组与标量相乘。因此,我正在考虑通过使用所谓的loop unrolling
. 到目前为止,我想出了这个:
public static float[] arrayTimesScalar(float[] array, float scalar){
int n = array.length;
float[] result = new float[n];
int m = n % 7;
if(n == 0){ throw new Error("The input array must,at least, hold one element"); }
if (n < 7){
for(int i = 0; i < 7; i++){
result[i] = scalar*array[i];
} // end for
}
else{
if (m != 0){
for(int i = 0; i < m; i++){
result[i] = scalar*array[i];
}
for(int i = m; i < n; i += 7){
result[i] = scalar*array[i];
result[i + 1] = scalar*array[i + 1];
result[i + 2] = scalar*array[i + 2];
result[i + 3] = scalar*array[i + 3];
result[i + 4] = scalar*array[i + 4];
result[i + 5] = scalar*array[i + 5];
result[i + 6] = scalar*array[i + 6];
}
}
else{
for(int i = 0; i < n; i += 7){
result[i] = scalar*array[i];
result[i + 1] = scalar*array[i + 1];
result[i + 2] = scalar*array[i + 2];
result[i + 3] = scalar*array[i + 3];
result[i + 4] = scalar*array[i + 4];
result[i + 5] = scalar*array[i + 5];
result[i + 6] = scalar*array[i + 6];
}
}
}
return result;
}
我真的很感激理解该方法现在是否正确,以及使用循环展开是否有意义,尽管编译器高度优化。