昨天在《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並行處理可能會效率更慢)
”
下次用什么來做遍歷操作,你清楚了嗎?