关于java性能的一个简单问题。如果我写一个循环
for(int i=0;i<n;++i) buffer[(k++)%buffer.length]=something;
其中有些东西是一个非平凡的数字滤波器。使用此代码,我在每次写入时都有一个模运算。这感觉有点傻,因为 Java VM 无论如何都会检查它。因此,我假设使用 ArrayIndexOutOfBounds 的构造会更快(缓冲区包含 1'000'000 个数字,所以我们不会经常出现溢出)
int i;
try
{
for(i=0;i<n;++i,++k) buffer[k]=something;
}
catch (ArrayIndexOutOfBounds e)
{
k=0;
for(;i<n;++i,++k) buffer[k]=something;
}
第三种解决方案可能是提前计算我们会溢出的点,然后手动将循环一分为二。确定循环可以走多远的代码每 768 个样本执行一次,因此从这个角度来看,它可能比 catch 方法慢。
这里的问题是,除了愚蠢的代码重复(我很乐意牺牲在性能的祭坛上)之外,我们还有更多的代码。在那里,Java 的优化通常不如较小的例程。
所以我的问题是:什么策略最有效?有人对这种结构有经验吗?另外,任何人都可以了解这两种结构在 android 设备上的性能吗?