for、foreach、stream 哪家的效率更高,你真的用對了嗎?


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

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

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

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

比較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循環____________");
        }
    }
}

  

測試結果:

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

運行多次,時間基本落在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____________");
        });
    }
}

  

測試結果:

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

運行多次,時間基本落在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、foreach、stream 哪家的效率更高,你真的用對了嗎?

基本和增強型for循環效率差別不大。

得出結論:

1萬以內的數據,for循環的性能要高於foreach和stream;

昨天那位同學說的沒毛病!!!

數據加到1000萬,代碼不變,看結果:

for循環

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

時間落在43240附近。

foreach循環

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

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

Stream

for、foreach、stream 哪家的效率更高,你真的用對了嗎?

基本和for循環,增強型for循環效率差別不大。

Stream的優勢在於,提供了並行處理(parallelStream()方法),即stream api提供了異步處理機制,可以充分利用CPU核數,大大提升效率!因為機器配置原因,沒有給出並行處理下的結果截圖~~

得出結論:

數據量上去之后,測試三種遍歷方式,基本已經沒有什么差距了,但是Stream提供並行處理,在數據量大了之后,效率會明顯增強。(但是單核CPU,Stream並行處理可能會效率更慢)

下次用什么來做遍歷操作,你清楚了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM