在Java中扩展数组的最有效方法?

Ian*_*ton 13 java arrays performance vector multiplication

(如果之前有人问过道歉 - 我不敢相信它没有,但我找不到一个.也许我的搜索功能很弱.)

多年来,我已经"知道"Java没有缩放数组的本机函数(即将每个元素乘以常量).所以我一直这样做:

for (int i=0; i<array.length; i++) {
  array[i] = array[i] * scaleFactor;
}
Run Code Online (Sandbox Code Playgroud)

这实际上是最有效的方式(例如,在这个应用程序中,它是一个大约10000个双倍的数组)?或者,还有更好的方法?

Jon*_*eet 13

看起来对我很好.我想不出更有效的方法.显然尝试将代码放在一个地方而不是将实际代码放在一起,但除此之外,没有明显的问题.


Ada*_*ski 8

我可以提供的其他建议是懒惰的比例,你只需要支付乘法访问每个元素的成本; 例如

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,这在某些情况下更好:

  • 当你的阵列是巨大的AND
  • 您只访问几个元素AND
  • 您通常只访问这些元素一次.

在其他情况下,它是一种微优化,对现代CPU没有任何实际好处.


Mac*_*Mac 5

"更好的方式"是写array[i] *= scaleFactor;而不是array[i] = array[i] * scaleFactor;.:-)

实际上,这只是语法糖 - 编译后的输出(以及性能)应该完全相同.正如乔恩所说,你不可能获得更好的表现,但就个人而言,我会减少任何一天的打字.