java 循环对比_Java stream 和 for 循环效率对比问题
針對(duì)同一個(gè)集合,用 stream 操作兩次得到兩個(gè)不同條件篩選出來(lái)的集合和map,和一次for循環(huán)就搞定搞定的效率對(duì)比。
雖然stream寫起來(lái)鏈?zhǔn)讲僮骱苁娣?#xff0c;但效率在不同數(shù)據(jù)量下的體現(xiàn)效果是不一樣的,以下為我的測(cè)試代碼:
@Test
public void testStreamAndFor() {
List studentList = new ArrayList<>();
// 初始數(shù)據(jù)量
int listSize = 100000;
// 測(cè)試次數(shù),以便求出平均運(yùn)行時(shí)長(zhǎng)
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 耗時(shí):" + 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 耗時(shí):" + forRunTime);
streamTotalRunTime = streamTotalRunTime.add(new BigDecimal(streamRunTime + ""));
forTotalRunTime = forTotalRunTime.add(new BigDecimal(forRunTime + ""));
}
System.out.println("list長(zhǎng)度為:" + listSize + ", 總共測(cè)試次數(shù):" + testTimes);
System.out.println("stream總運(yùn)行時(shí)間(ms) :" + streamTotalRunTime);
System.out.println("for總運(yùn)行時(shí)間(ms) :" + forTotalRunTime);
BigDecimal streamAverageRunTime = streamTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("stream平均每次運(yùn)行時(shí)間(ms) :" + streamAverageRunTime);
BigDecimal forAverageRunTime = forTotalRunTime.divide(new BigDecimal(testTimes + ""), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("for平均每次運(yùn)行時(shí)間(ms) :" + forAverageRunTime);
}
當(dāng)數(shù)據(jù)量為10w,測(cè)試5次的結(jié)果輸出:
第1次:stream 耗時(shí):81
第1次:for 耗時(shí):13
第2次:stream 耗時(shí):15
第2次:for 耗時(shí):23
第3次:stream 耗時(shí):7
第3次:for 耗時(shí):11
第4次:stream 耗時(shí):7
第4次:for 耗時(shí):13
第5次:stream 耗時(shí):9
第5次:for 耗時(shí):6
list長(zhǎng)度為:100000, 總共測(cè)試次數(shù):5
stream總運(yùn)行時(shí)間(ms) :119
for總運(yùn)行時(shí)間(ms) :66
stream平均每次運(yùn)行時(shí)間(ms) :23.80
for平均每次運(yùn)行時(shí)間(ms) :13.20
當(dāng)數(shù)據(jù)量為100w,測(cè)試5次的輸出結(jié)果:
第1次:stream 耗時(shí):165
第1次:for 耗時(shí):1296
第2次:stream 耗時(shí):447
第2次:for 耗時(shí):62
第3次:stream 耗時(shí):363
第3次:for 耗時(shí):359
第4次:stream 耗時(shí):61
第4次:for 耗時(shí):350
第5次:stream 耗時(shí):389
第5次:for 耗時(shí):43
list長(zhǎng)度為:1000000, 總共測(cè)試次數(shù):5
stream總運(yùn)行時(shí)間(ms) :1425
for總運(yùn)行時(shí)間(ms) :2110
stream平均每次運(yùn)行時(shí)間(ms) :285.00
for平均每次運(yùn)行時(shí)間(ms) :422.00
所有運(yùn)行時(shí)長(zhǎng)單位均為ms。綜上測(cè)試結(jié)果,當(dāng)數(shù)據(jù)量少于百萬(wàn)級(jí)別的,一次for循環(huán)來(lái)篩選數(shù)據(jù)效率更高,當(dāng)數(shù)據(jù)量達(dá)到八萬(wàn)級(jí)別,還是使用stream來(lái)操作更加具有效率。但是小弟還是有點(diǎn)不明白原因是為何,求高人指點(diǎn)一二
總結(jié)
以上是生活随笔為你收集整理的java 循环对比_Java stream 和 for 循环效率对比问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件批量处理器Android,GFile
- 下一篇: oracle怎么设置出蓝色边,Oracl