Java嵌套的Foreach在强制转换时变慢
我正在用Java编写一个exchange系统,但我似乎遇到了严重的性能问题 以下代码是执行变得非常慢的地方: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
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);