Gangs165700:
List<Batch> vAllBatchList = getAllBatchCollection().toList(); //Has 700k records
List<Batch> vKeepableBatchCollection = getKeepableBatchCollection(pDaysKeepHistory).toList(); //has 600k records
vAllBatchList.removeAll(vKeepableBatchCollection);
上記の3行目のがremoveAll方法で仕上げにあまりにも多くの時間を取っています。ここのremoveAll方法を最適化するには?
彼らは次のとおりでした:
あなたが変換した場合List
に削除するには、要素のをSet
、それはより速くする必要があります:
vAllBatchList.removeAll(new HashSet<>(vKeepableBatchCollection));
これは仮定されたBatch
クラスのオーバーライドをhashCode
し、equals
適切に。
説明:removeAll
のためにArrayList
(私はあなたが想定していvAllBatchList
List
ているArrayList
のすべての要素を反復)List
渡され、それが呼び出された上で、そしてかどうかをチェックしCollection
、それらが含まれています。合格した場合Collection
でSet
、contains
期待される一定の時間を(かかるO(1)
場合ながら、)Collection
でList
、それは線形時間がかかります(O(n)
)。
もちろん、あなたが直接生成することができるかどうかSet
の要素のvKeepableBatchCollection
代わりに、最初の作成のList
、その後に変換しSet
、それも良いだろう。