在我的代码中,我一直在使用存储库的findAll查询1万个项目的列表。
只有一个List
引用,我为其分配findAll
的结果,然后为List
的项目运行一个循环。
DB中的总记录通常是10K的几倍,即循环当前在6到12次之间进行迭代。
我观察到的是,在大约20K个读取项目之后,该循环中的后续处理开始需要更多时间。
如果我将List.addAll()
用于findAll
个项目,而不是分配引用,并且在添加下一个项目块之前,我使用List.clear()
清除列表,则迭代的执行时间保持不变,并且不会t依次增加。
代码的迭代时间增加,
while(condition){
List<T> reference = repo.findAll()
for(T t:reference){
//Processing
}
//Check Condition if its false
}
恒定时间
List<T> reference = new ArrayList<>();
while(condition){
reference.addAll(repo.findAll())
for(T t:reference){
//Processing
}
reference.clear();
//Check Condition if its false
}
不知道为什么对象的缺口也应该在一开始被垃圾收集?
答案 0 :(得分:-1)
第一种方法是在每个循环中丢弃分配的支持数组,这将浪费大量时间到GC和重新分配空间。
但是,第二个方法可重复使用支持数组,并减少了GC和重新分配时间。