我正在用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 投射对象时,执行会有很大的延迟。这有什么工作吗?我很难过。
提前致谢!
答案 0 :(得分:3)
你测量错了。
当您编写Object buyOffer = listBuy.get(i);
时,内部循环没有副作用,JIT编译器完全消除了循环。
使用Offer buyOffer
JIT不允许删除循环,因为现在每个列表访问都可能产生抛出ClassCastException
的副作用。
类型检查是一种快速操作,我怀疑它是您应用程序的瓶颈。最有可能的算法本身并不是最理想的,因为它具有立方复杂性。