lambda表示式foreach效能分析
阿新 • • 發佈:2019-01-03
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計算型別的操作,單執行緒效能更高,減少上下文切換的開銷。