Casting时Java嵌套的Foreach SLOW

时间:2015-10-17 15:29:27

标签: java performance loops nested

我正在用Java编写一个交换系统,但我似乎遇到了严重的性能问题。

以下代码是执行非常慢的地方:

    outer:
    for(ArrayList<Offer> listSell : sellOffers.values()) {
        for(Offer sellOffer : listSell) {
            ArrayList<Offer> listBuy = buyOffers.get(getStorageHash(sellOffer));
            if(listBuy == null)
                continue outer;
            for(int i = 0; i < listBuy.size(); i++) {
                Offer buyOffer = listBuy.get(i);
                //todo - handle exchange
            }
        }
    }

在深入研究之后,我发现以下几行似乎是问题所在:

                Offer buyOffer = listBuy.get(i);

如果我将此行更改为以下内容,则不会再削弱执行时间:

                Object buyOffer = listBuy.get(i);

因此,当从 listBuy 投射对象时,执行会有很大的延迟。这有什么工作吗?我很难过。

提前致谢!

1 个答案:

答案 0 :(得分:3)

你测量错了。

当您编写Object buyOffer = listBuy.get(i);时,内部循环没有副作用,JIT编译器完全消除了循环。

使用Offer buyOffer JIT不允许删除循环,因为现在每个列表访问都可能产生抛出ClassCastException的副作用。

类型检查是一种快速操作,我怀疑它是您应用程序的瓶颈。最有可能的算法本身并不是最理想的,因为它具有立方复杂性。