當前位置:
首頁 > 知識 > lambda表達式foreach性能分析

lambda表達式foreach性能分析

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

話不多說,上代碼:

  1. @Test
  2. public void test2(){
  3. List<String> list = new ArrayList<>();
  4. for(int i=0;i<10000;i++)
  5. list.add(String.valueOf(i));
  6. //lambda表達式
  7. long start = System.currentTimeMillis();
  8. // list.parallelStream().forEach((s)->{
  9. // s.toString();
  10. // });
  11. //普通測試
  12. for (Object s :list){
  13. s.toString();
  14. }
  15. long end = System.currentTimeMillis();
  16. System.out.println("耗時:"+(end-start) +" ms");
  17. }

測試結果如下:

lambda表達式foreach性能分析

普通fo循環耗時3ms。

lambda表達式foreach性能分析

為何lambda表達式的性能比普通的還差,我猜測是因為:list.parallelStream()是並發處理的,大量的線程上下文切換導致性能下降。如何證明?那就把for循環里的處理時間設置長一點吧,設置成如下代碼:

  1. public void test1(){
  2. List<String> list = new ArrayList<>();
  3. for(int i=0;i<10000;i++)
  4. list.add(String.valueOf(i));
  5. //lambda表達式
  6. long start = System.currentTimeMillis();
  7. // list.parallelStream().forEach((s)->{
  8. // try {
  9. // Thread.sleep(4);
  10. // } catch (InterruptedException e) {
  11. // e.printStackTrace();
  12. // }
  13. // });
  14. //普通測試
  15. for (Object s :list){
  16. try {
  17. Thread.sleep(4);
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. s.toString();
  22. }
  23. long end = System.currentTimeMillis();
  24. System.out.println("耗時:"+(end-start) +" ms");
  25. }

測試結果:

lambda表達式foreach性能分析

普通耗時:13454ms

lambda表達式foreach性能分析

lambda表達式耗時3314秒。

果然如老夫所料。

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

lambda表達式foreach性能分析

普通for循環只有主線程在處理。

lambda表達式foreach性能分析

lambda表達式的啟了三個worker線程處理。

再一次驗證了我的想法。

所以結論是:對於耗時的操作用lambda表達式的for循環,如資料庫的IO操作,多線程充分利用CPU資源;對於不太耗時的操作使用普通for循環,比如純CPU計算類型的操作,單線程性能更高,減少上下文切換的開銷。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

一些docker的技巧和秘訣
全方面了解和學習PHP框架

TAG:程序員小新人學習 |