lambda表達式foreach性能分析
知識
07-12
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計算類型的操作,單線程性能更高,減少上下文切換的開銷。
TAG:程序員小新人學習 |