1. 程式人生 > >lambda表示式foreach效能分析

lambda表示式foreach效能分析

java 8的新特性之一就是lambda表示式,都說效能會比較高,現一探究竟。

話不多說,上程式碼:

    @Test
    public void test2(){

        List<String> list = new ArrayList<>();
        for(int i=0;i<10000;i++)
            list.add(String.valueOf(i));
        //lambda表示式
        long start = System.currentTimeMillis();
//        list.parallelStream().forEach((s)->{
//            s.toString();
//        });
        //普通測試
        for (Object s :list){
            s.toString();
        }
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+(end-start) +"  ms");
    }
測試結果如下:

         

           普通fo迴圈耗時3ms。           

     

           為何lambda表示式的效能比普通的還差,我猜測是因為:list.parallelStream()是併發處理的,大量的執行緒上下文切換導致效能下降。如何證明?那就把for迴圈裡的處理時間設定長一點吧,設定成如下程式碼:

    public void test1(){

        List<String> list = new ArrayList<>();
        for(int i=0;i<10000;i++)
            list.add(String.valueOf(i));
        //lambda表示式
        long start = System.currentTimeMillis();
//        list.parallelStream().forEach((s)->{
//            try {
//                Thread.sleep(4);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        });
        //普通測試
		for (Object s :list){
			try {
				Thread.sleep(4);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			s.toString();
		}
        long end = System.currentTimeMillis();
        System.out.println("耗時:"+(end-start) +" ms");
    }
      測試結果:


      普通耗時:13454ms


     lambda表示式耗時3314秒。

     果然如老夫所料。

     再次驗證list.parallelStream()是多執行緒執行, 用visualVM工具看執行時的執行緒情況,如下:


      普通for迴圈只有主執行緒在處理。


     lambda表示式的啟了三個worker執行緒處理。

     再一次驗證了我的想法。

     所以結論是:對於耗時的操作用lambda表示式的for迴圈,如資料庫的IO操作,多執行緒充分利用CPU資源;對於不太耗時的操作使用普通for迴圈,比如純CPU計算型別的操作,單執行緒效能更高,減少上下文切換的開銷。