1. 程式人生 > 程式設計 >詳解lambda表示式foreach效能分析

詳解lambda表示式foreach效能分析

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

話不多說,上程式碼:

 @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");
  }

測試結果如下:

詳解lambda表示式foreach效能分析

普通fo迴圈耗時3ms。

詳解lambda表示式foreach效能分析

為何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");
  }

測試結果:

詳解lambda表示式foreach效能分析

普通耗時:13454ms

詳解lambda表示式foreach效能分析

lambda表示式耗時3314秒。

果然如老夫所料。

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

詳解lambda表示式foreach效能分析

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

詳解lambda表示式foreach效能分析

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

再一次驗證了我的想法。

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

到此這篇關於詳解lambda表示式foreach效能分析的文章就介紹到這了,更多相關lambda表示式foreach效能內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!