Java List.clear()与引用重新分配性能

Java List.clear()与引用重新分配性能,java,spring-data-jpa,spring-repositories,Java,Spring Data Jpa,Spring Repositories,在我的代码中,我一直在使用存储库查询一个包含10k项的列表 只有一个List引用,我将findAll的结果分配给它,然后对List的项运行一个循环 以DB为单位的总记录通常是10K的几倍,即循环当前的迭代次数介于6到12次之间 我所观察到的是,循环中的连续处理在大约20K个读取项之后开始花费更多的时间 如果我对findAll项目使用List.addAll(),在添加下一个项目块之前,我使用List.clear()清除列表,而不是分配引用,那么迭代的执行时间保持不变,并且不会连续增加 随着迭代时间

在我的代码中,我一直在使用存储库查询一个包含10k项的列表

只有一个
List
引用,我将
findAll
的结果分配给它,然后对
List
的项运行一个循环

以DB为单位的总记录通常是10K的几倍,即循环当前的迭代次数介于6到12次之间

我所观察到的是,循环中的连续处理在大约20K个读取项之后开始花费更多的时间

如果我对
findAll
项目使用
List.addAll()
,在添加下一个项目块之前,我使用
List.clear()
清除列表,而不是分配引用,那么迭代的执行时间保持不变,并且不会连续增加

随着迭代时间的增加

while(condition){
  List<T> reference = repo.findAll()
  for(T t:reference){
   //Processing 
  }
  //Check Condition if its false
}
while(条件){
列表引用=repo.findAll()
for(T:参考){
//加工
}
//检查条件是否为假
}
恒定时间

List<T> reference = new ArrayList<>();
while(condition){
  reference.addAll(repo.findAll())
  for(T t:reference){
   //Processing 
  }
reference.clear();
//Check Condition if its false
}
List reference=new ArrayList();
while(条件){
reference.addAll(repo.findAll())
for(T:参考){
//加工
}
reference.clear();
//检查条件是否为假
}
不确定为什么gap as对象也应该在第一个实例中进行垃圾收集


相关问题-

第一种方法会在每个循环中丢弃已分配的备份阵列,这将浪费大量时间用于GC和重新分配空间

但是,第二种方法重用了备份阵列并减少了GC和重新分配时间


请参阅:

我假设这与增加ArrayList有关。在这里阅读更多关于该主题的内容:“开始花费更多的时间…”您实际测量的是什么,以及您是如何测量的?@Michel:我刚刚使用
System.currentTimeMillis()
记录了循环迭代时间。就像前10k项一样,迭代时间在100ms范围内,然后在接下来的几次迭代中,它开始上升到300ms,然后在接下来的几次迭代中上升到500ms,依此类推本身会给迭代时间增加几毫秒?@S.K.是的,这就是逻辑&在链接QA中也是如此。只是注意到了这种行为,所以提出问题。