昨天在《SQL中那么多函數,Java8為什么還要提供重復的Stream方法,多此一舉?》一文中,有同學指出Stream在數據量不龐大的情況,效率不如for循環。

這個就觸及到我的知識盲區了,今天趕緊測試了一下,以下是正文,有問題歡迎大家指出,一起學習!

比較for循環、foreach循環及Stream方法效率
for循環
首先,10000數據的for循環,代碼如下:
public class ForTest {
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
formMethod();
Long endTime = System.currentTimeMillis();
System.out.println("time_total:" + (endTime - startTime));
}
public static void formMethod(){
for (int i = 0; i < 10000; i++) {
System.out.println("__________for循環____________");
}
}
}
測試結果:

運行多次,時間基本落在100內,90左右。
foreach循環
同樣數據量,代碼如下:
public class ForTest {
public static void main(String[] args) {
List<Integer> lists = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
lists.add(i);
}
Long startTime = System.currentTimeMillis();
formMethod(lists);
Long endTime = System.currentTimeMillis();
System.out.println("time_total:" + (endTime - startTime));
}
public static void formMethod(List<Integer> lists){
lists.forEach(i->{
System.out.println("__________forEach____________");
});
}
}
測試結果:

運行多次,時間基本落在150左右。額,這個增強型效果不如for循環~
Stream
同樣數據量,代碼如下:
public class ForTest {
public static void main(String[] args) {
List<Integer> lists = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
lists.add(i);
}
Long startTime = System.currentTimeMillis();
formMethod(lists);
Long endTime = System.currentTimeMillis();
System.out.println("time_total:" + (endTime - startTime));
}
public static void formMethod(List<Integer> lists){
lists.stream().forEach(i->{
System.out.println("__________stream處理____________");
});
}
}
測試結果:

基本和增強型for循環效率差別不大。
得出結論:
★
1萬以內的數據,for循環的性能要高於foreach和stream;
”
昨天那位同學說的沒毛病!!!
數據加到1000萬,代碼不變,看結果:
for循環

時間落在43240附近。
foreach循環

基本和for循環效率差別不大。
Stream

基本和for循環,增強型for循環效率差別不大。
Stream的優勢在於,提供了並行處理(parallelStream()方法),即stream api提供了異步處理機制,可以充分利用CPU核數,大大提升效率!因為機器配置原因,沒有給出並行處理下的結果截圖~~
得出結論:
★
數據量上去之后,測試三種遍歷方式,基本已經沒有什么差距了,但是Stream提供並行處理,在數據量大了之后,效率會明顯增強。(但是單核CPU,Stream並行處理可能會效率更慢)
”
下次用什么來做遍歷操作,你清楚了嗎?
