0

在我的一个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;

}

我真的很感激理解该方法现在是否正确,以及使用循环展开是否有意义,尽管编译器高度优化。

4

2 回答 2

2

循环展开是一种低级优化,它很可能在现代 JVM 上没有意义。但是,您不应该猜测或询问其他人:您应该在目标系统上测试您的代码并测量性能。

至于正确性,我相信这也很容易验证,例如通过编写单元测试。您的代码没有明显的问题。

于 2013-07-03T08:02:17.260 回答
0

根据您的 n 有多大以及时间限制有多难,您可以将乘法并行化以确保一段时间的安全。但这当然是一个巨大的变化,但我认为这样高层次的变化是提高性能的唯一选择。

诸如循环展开之类的“微不足道”的事情是由编译器和 JIT 在运行时完成的。

于 2013-07-03T08:21:30.090 回答