在小型int数组上优化a方法,java

在小型int数组上优化a方法,java,java,arrays,Java,Arrays,爪哇 我有一个非常小的int数组(4个元素) 获得最大价值的最快方法是什么?所有值都将介于0和255之间 而且int数组比byte数组快?投得很成功吗 获取所有值之和的最快方法是什么 我问的原因是因为这是我继承的程序中的一个主要瓶颈。他们说起来并不慢,但是这个家伙多次调用这些方法,结果都是合二为一的。最终,我需要重写整个过程,但我需要寻找一些快速的技巧来在短期内加快速度。如果您: 迭代数组一次 仅使用基本类型(不使用包装器) 然后在其他地方查找性能问题。如果您: 迭代数组一次 仅使用基本类

爪哇

我有一个非常小的int数组(4个元素)

获得最大价值的最快方法是什么?所有值都将介于0和255之间

而且int数组比byte数组快?投得很成功吗

获取所有值之和的最快方法是什么

我问的原因是因为这是我继承的程序中的一个主要瓶颈。他们说起来并不慢,但是这个家伙多次调用这些方法,结果都是合二为一的。最终,我需要重写整个过程,但我需要寻找一些快速的技巧来在短期内加快速度。

如果您:

  • 迭代数组一次
  • 仅使用基本类型(不使用包装器)
然后在其他地方查找性能问题。

如果您:

  • 迭代数组一次
  • 仅使用基本类型(不使用包装器)

然后在其他地方寻找性能问题。

获取4个值之和的最快方法是
sum=a[0]+a[1]+a[2]+a[3]
获取4个值之和的最快方法是
sum=a[0]+a[1]+a[2]+a[3]
我来试试看。。。基本上是一个展开的循环。JIT可能已经意识到一个循环会从0变为3,并且无论如何都会自动展开,但是谁知道呢

public static int max(int[] a) {
    int max = a[0] > a[1] ? a[0] : a[1];
    max = a[2] > max ? a[2] : max;
    return a[3] > max ? a[3] : max;
}
显然,总和应该是
a[0]+a[1]+a[2]+a[3]



您也可以尝试将四个0-255值打包成一个整数,然后执行一些位操作。

我来试试。。。基本上是一个展开的循环。JIT可能已经意识到一个循环会从0变为3,并且无论如何都会自动展开,但是谁知道呢

public static int max(int[] a) {
    int max = a[0] > a[1] ? a[0] : a[1];
    max = a[2] > max ? a[2] : max;
    return a[3] > max ? a[3] : max;
}
显然,总和应该是
a[0]+a[1]+a[2]+a[3]


您还可以尝试将四个0-255值打包成一个int,然后执行一些位操作

获得最大价值的最快方法是什么?所有值都将介于0之间 和255

在逻辑上获得最大值需要至少查看(并比较)每个值一次,因此简单的方法(取第一个元素,比较每个元素并保留较大的元素)非常理想

此外,int数组比byte数组快 大堆投得很成功吗

可能会有所不同。很难说清楚。基准和/或配置文件

获取所有值之和的最快方法是什么

同样是直截了当的方式

总的来说,在您的情况下,最大的潜在速度提升似乎不是优化此阵列上显然非常简单的操作,而是找到一种减少执行次数的方法

获得最大价值的最快方法是什么?所有值都将介于0之间 和255

在逻辑上获得最大值需要至少查看(并比较)每个值一次,因此简单的方法(取第一个元素,比较每个元素并保留较大的元素)非常理想

此外,int数组比byte数组快 大堆投得很成功吗

可能会有所不同。很难说清楚。基准和/或配置文件

获取所有值之和的最快方法是什么

同样是直截了当的方式


总的来说,在您的情况下,最大的潜在速度增益似乎不是优化此阵列上显然非常简单的操作,但是找到一种减少执行次数的方法。

如果数组中的值不经常更改,但需要非常频繁的最大值,那么缓存最大值而不是每次都计算它可能是有益的。

如果数组中的值不经常更改,但需要非常频繁的最大值那么,缓存最大值可能会有好处,而不是每次都计算它。

我建议使用自定义类包装数组。此类可以在设置数据时计算最大值和右和,然后缓存数据。如果以后要更改数据,缓存也会更新


当然,这是假设获取max和sum的需要比更改数据的需要要频繁得多。

我建议使用自定义类包装数组。此类可以在设置数据时计算最大值和右和,然后缓存数据。如果以后要更改数据,缓存也会更新


当然,这是假设获取最大值和总和的需要比更改数据的需要更频繁。

他也需要总和。看最后一个问题,嗯。。对的但我不确定这是否是他的错误,可能是。不管怎样,我刚刚意识到如果他想要求和和和max,他可以在一个for循环中同时求和。他也需要求和。看最后一个问题,嗯。。对的但我不确定这是否是他的错误,可能是。不管怎样,我刚刚意识到如果他想要sum和max,他可以在一个for循环中同时做这两件事。你能发布代码吗?如果在查找最多4个值时存在瓶颈,则不太可能是一个问题区域。可能有更好的解决方法,比如避免调用本身。你能发布代码吗?如果在查找最多4个值时存在瓶颈,则不太可能是一个问题区域。可能有更好的解决方法,比如避免呼叫本身。