java 循环对比_Java stream 和 for 循环效率对比问题
針對同一個集合,用 stream 操作兩次得到兩個不同條件篩選出來的集合和map,和一次for循環就搞定搞定的效率對比。
雖然stream寫起來鏈式操作很舒服,但效率在不同數據量下的體現效果是不一樣的,以下為我的測試代碼:
@Test
public void testStreamAndFor() {
List studentList = new ArrayList<>();
// 初始數據量
int listSize = 100000;
// 測試次數,以便求出平均運行時長
int testTimes = 5;
for (int i = 0; i < listSize; i++) {
Student student = new Student();
student.setId(i + 1);
student.setStudentName("name" + i);
student.setAge(i);
studentList.add(student);
}
BigDecimal streamTotalRunTime = new BigDecimal("0");
BigDecimal forTotalRunTime = new BigDecimal("0");
for (int i = 0; i < testTimes; i++) {
Instant streamStart = Instant.now();
Map idMapOfStream = studentList.stream()
.collect(Collectors.toMap(Student::getId, v -> v));
List studentAgeListOfStream = studentList.stream()
.map(Student::getAge)
.collect(Collectors.toList());
long streamRunTime = Duration.between(streamStart, Instant.now()).toMillis();
System.out.println("第" + (i + 1) + "次:" + "stream 耗時:" + streamRunTime);
Instant forStart = Instant.now();
int size = studentList.size();
Map idMapOfFor = new HashMap<>(size);
List ageListOfFor = new ArrayList<>();
for (Student student : studentList) {
idMapOfFor.put(student.getId(), student);
ageListOfFor.add(student.getAge());
}
long forRunTime = Duration.between(forStart, Instant.now()).toMillis();
System.out.println("第" + (i + 1) + "次:" + "for 耗時:" + forRunTime);
streamTotalRunTime = streamTotalRunTime.add(new BigDecimal(streamRunTime + ""));
forTotalRunTime = forTotalRunTime.add(new BigDecimal(forRunTime + ""));
}
System.out.println("list長度為:" + listSize + ", 總共測試次數:" + testTimes);
System.out.println("stream總運行時間(ms) :" + streamTotalRunTime);
System.out.println("for總運行時間(ms) :" + forTotalRunTime);
BigDecimal streamAverageRunTime = streamTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("stream平均每次運行時間(ms) :" + streamAverageRunTime);
BigDecimal forAverageRunTime = forTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("for平均每次運行時間(ms) :" + forAverageRunTime);
}
當數據量為10w,測試5次的結果輸出:
第1次:stream 耗時:81
第1次:for 耗時:13
第2次:stream 耗時:15
第2次:for 耗時:23
第3次:stream 耗時:7
第3次:for 耗時:11
第4次:stream 耗時:7
第4次:for 耗時:13
第5次:stream 耗時:9
第5次:for 耗時:6
list長度為:100000, 總共測試次數:5
stream總運行時間(ms) :119
for總運行時間(ms) :66
stream平均每次運行時間(ms) :23.80
for平均每次運行時間(ms) :13.20
當數據量為100w,測試5次的輸出結果:
第1次:stream 耗時:165
第1次:for 耗時:1296
第2次:stream 耗時:447
第2次:for 耗時:62
第3次:stream 耗時:363
第3次:for 耗時:359
第4次:stream 耗時:61
第4次:for 耗時:350
第5次:stream 耗時:389
第5次:for 耗時:43
list長度為:1000000, 總共測試次數:5
stream總運行時間(ms) :1425
for總運行時間(ms) :2110
stream平均每次運行時間(ms) :285.00
for平均每次運行時間(ms) :422.00
所有運行時長單位均為ms。綜上測試結果,當數據量少于百萬級別的,一次for循環來篩選數據效率更高,當數據量達到八萬級別,還是使用stream來操作更加具有效率。但是小弟還是有點不明白原因是為何,求高人指點一二
總結
以上是生活随笔為你收集整理的java 循环对比_Java stream 和 for 循环效率对比问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件批量处理器Android,GFile
- 下一篇: java 压缩gz_如何在Java中将.