奇怪的Java性能问题(JIT优化?)

时间:2017-05-22 22:31:16

标签: java performance

我的实用程序类中出现了非常奇怪的性能下降 - 很快我就将方法last(revIndex)添加到我的本机ArrayDeque类的克隆中,该类没有索引访问权限

public E last(int revIndex) {
    return (E)elements[arrBackPos(revIndex)];
}

protected int arrBackPos(int index) {
    int size = (tail - head) & (elements.length - 1);
    if( index > 0 || -index >= size )
        throw new IndexOutOfBoundsException("...");
    return (tail + index - 1) & (elements.length - 1);
}

使用NetBeans'测试我的代码时它表明arrBackPos是远远落后于其他CPU的消费者。删除安全检查(前三行)后 - 代码变得更快(10秒对20秒),但是......在尝试优化代码后,我注意到在某些条件下,相同的安全检查代码增加了可忽略的时间(类似于10.2秒对10秒) - 只需删除/重新添加/重新编译代码可能会解决问题一段时间,但由于某些未知原因会在以后的执行中重新出现。

那么......它是什么?为什么相同执行条件下的相同代码运行速度慢2倍?有没有办法让表现持续快速?

我怀疑短期运行时不会触发JIT,但运行1..2分钟的数据集会出现同样的问题。

0 个答案:

没有答案