在我的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;
}
我真的很感激理解这个方法现在是否正确以及使用循环展开是否有任何意义,尽管高度优化的编译器。
答案 0 :(得分:2)
循环展开是一种低级优化,它很可能在现代JVM上没有意义。但是,您不应该猜测或问别人:您应该在目标系统上测试代码并测量性能。
至于正确性,我相信通过编写单元测试也很容易验证。你的代码没有明显的错误。
答案 1 :(得分:0)
根据n的大小以及时间限制的难度,您可以将乘法并行化一段时间。但这当然是一个巨大的变化,但我认为这种高层次的变化是提高绩效的唯一选择。
循环展开的“琐碎”事情由编译器和JIT在运行时完成。