Java 数组乘以标量:循环展开

Java 数组乘以标量:循环展开,java,arrays,for-loop,Java,Arrays,For Loop,在我的JAVA项目中,我通常必须用标量乘以巨大的数组。因此,我想通过使用所谓的循环展开来编写一个方法。到目前为止,我已经得出了以下结论: 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

在我的
JAVA
项目中,我通常必须用标量乘以巨大的数组。因此,我想通过使用所谓的
循环展开
来编写一个方法。到目前为止,我已经得出了以下结论:

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;
publicstaticfloat[]arraytimescalar(float[]array,float scalar){
int n=数组长度;
float[]结果=新的float[n];
int m=n%7;
如果(n==0){抛出新错误(“输入数组必须至少包含一个元素”);}
if(n<7){
对于(int i=0;i<7;i++){
结果[i]=标量*数组[i];
}//结束
}
否则{
如果(m!=0){
for(int i=0;i
}


我非常希望了解该方法现在是否正确,以及使用循环展开是否有意义,尽管编译器经过了高度优化。

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


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

根据n的大小和时间限制的难易程度,您可以将乘法并行化以确保安全。但这当然是一个巨大的变化,但我认为这种高级别的变化是提高性能的唯一选择


诸如循环展开之类的“琐碎”工作是由编译器和JIT在运行时完成的。

要确定它是否正确,您应该编写一些单元测试。为了确定它是否有意义,您应该对它进行基准测试。JIT编译器将为您执行循环展开-如果您需要优化代码的一部分,有更好的方法可以花费时间。让JIT发挥作用的最好办法是编写简单而直接的代码——在您的例子中:一个简单的for循环,增量为1,就像您用于
n<7
的循环一样。