Java嵌套的Foreach在强制转换时变慢

Java嵌套的Foreach在强制转换时变慢,java,performance,loops,nested,Java,Performance,Loops,Nested,我正在用Java编写一个exchange系统,但我似乎遇到了严重的性能问题 以下代码是执行变得非常慢的地方: outer: for(ArrayList<Offer> listSell : sellOffers.values()) { for(Offer sellOffer : listSell) { ArrayList<Offer> listBuy = buyOffers.get(getStorageHash(sel

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

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

    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
            }
        }
    }
如果我将此行更改为以下内容,它将不再影响执行时间:

                Object buyOffer = listBuy.get(i);
因此,当从listBuy对对象进行强制转换时,执行会出现严重延迟。这方面有什么办法吗?我被难住了

提前谢谢

你测量错了

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

使用
Offer-buyOffer
JIT不允许删除循环,因为现在每个列表访问都有可能引发
ClassCastException
的副作用


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

这些强制转换不会直接发生在您的面前,我有理由怀疑强制转换是否是您运行的三重嵌套循环的原因。为什么您要从foreach循环(
for(Offer-sellOffer:listSell)
)不建议对for循环(
for(int i=0;iLoop标签(
outer
)进行普通化,只应在需要的地方使用。您不需要它,因为使用
break
将获得相同的结果。感谢@Andreas提供的外部提示。我使用普通循环只是为了测试转换理论。
                Object buyOffer = listBuy.get(i);