(如果之前有人问过道歉 - 我无法相信它没有,但我找不到。也许我的搜索功能很弱。)
多年来,我已经“知道”Java没有缩放数组的本机函数(即将每个元素乘以常量)。所以我一直这样做:
for (int i=0; i<array.length; i++) {
array[i] = array[i] * scaleFactor;
}
这实际上是最有效的方式(例如,在这个应用程序中,它是一个大约10000个双倍的数组)?或者有更好的方法吗?
答案 0 :(得分:13)
对我来说绝对没问题。我想不出更有效的方法。显然尝试将代码放在一个地方而不是将实际代码放在一处,但除此之外,没有明显的问题。
答案 1 :(得分:8)
我能提供的其他建议是懒惰的比例,你只需支付乘法费用就可以获得每个元素; e.g。
public class MyArray {
private final double[] arr;
private double scale = 1.0;
public MyArray(double[] arr) {
this.arr = arr;
}
public double getScale() {
return scale;
}
public void setScale(double scale) {
this.scale = scale;
}
public double elementAt(int i) {
return arr[i] * scale;
}
}
显然,在某些情况下这只会更好:
在其他情况下,这是一种微优化,对现代CPU没有任何实际好处。
答案 2 :(得分:5)
“更好的方法”是写array[i] *= scaleFactor;
而不是array[i] = array[i] * scaleFactor;
。 : - )
实际上,这只是语法糖 - 编译后的输出(以及性能)应该完全相同。正如乔恩所说,你不可能获得更好的表现,但就个人而言,我会减少任何一天的打字。
答案 3 :(得分:3)
除了Adamski和Jon Skeet之外,我唯一可以想到的是,如果它恰好是一个整数/长整数并且您以2的幂进行缩放,那么通过使用它可能会略有改善bitshift运算符。但是YMMV,因为它取决于编译器(甚至可能是VM)。
答案 4 :(得分:1)
在Java 8中:
double coef = 3.0;
double[] x1 = {1,2,3};
double[] x2 = DoubleStream.of(x1).map(d->d*coef).toArray();
System.out.println(Arrays.toString(x2));
输出:[3.0, 6.0, 9.0]
答案 5 :(得分:0)
您可以使用线程来减少运行时间,但最重要的是您将包含此代码并让每个线程运行for循环的一部分,以便生成的程序与您的一样高效;它变得更快
答案 6 :(得分:0)
看起来最适合我。
不要因错误的优化而失败,例如在循环外的最后一个字段中声明数组长度。这适用于集合,它避免重复方法调用.size()和字符串,避免对.length()的方法调用,但在数组上.length已经是公共最终字段。
此外,向后循环向零可能是汇编语言优化,但在像Java这样的高级语言中,VM将处理任何明显的调整。