詳解lambda表達式foreach性能分析
java 8的新特性之一就是lambda表達式,parallelStream()都說性能會比較高,現(xiàn)一探究竟。
話不多說,上代碼:
@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循環(huán)耗時3ms。

為何lambda表達式的性能比普通的還差,我猜測是因為:list.parallelStream()是并發(fā)處理的,大量的線程上下文切換導致性能下降。如何證明?那就把for循環(huán)里的處理時間設置長一點吧,設置成如下代碼:
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()是多線程執(zhí)行, 用visualVM工具看運行時的線程情況,如下:

普通for循環(huán)只有主線程在處理。

lambda表達式的啟了三個worker線程處理。
再一次驗證了我的想法。
所以結論是:對于耗時的操作用lambda表達式的for循環(huán),如數(shù)據(jù)庫的IO操作,多線程充分利用CPU資源;對于不太耗時的操作使用普通for循環(huán),比如純CPU計算類型的操作,單線程性能更高,減少上下文切換的開銷。
到此這篇關于詳解lambda表達式foreach性能分析的文章就介紹到這了,更多相關lambda表達式foreach性能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot集成PageHelper分頁失效的原因及解決
項目啟動初期,在集成mybatis的分頁插件,自定義封裝了一個分頁的工具類,方便后期項目的擴展,結果無法分頁了,怎么設置搞都沒辦法正常分頁,所以本文將給大家介紹一下springboot集成PageHelper分頁失效的原因及解決,需要的朋友可以參考下2023-10-10
Java數(shù)據(jù)結構之棧與綜合計算器的實現(xiàn)
這篇文章主要為大家詳細介紹了Java數(shù)據(jù)結構中棧與綜合計算器的實現(xiàn),文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下2022-10-10
springmvc開啟異步請求報錯Java code using the Ser
這篇文章主要為大家介紹了springmvc開啟異步請求報錯Java code using the Servlet API or解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02
詳解SpringMVC使用MultipartFile實現(xiàn)文件的上傳
本篇文章主要介紹了SpringMVC使用MultipartFile實現(xiàn)文件的上傳,本地的文件上傳到資源服務器上,比較好的辦法就是通過ftp上傳。這里是結合SpringMVC+ftp的形式上傳的,有興趣的可以了解一下。2016-12-12
Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解
這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解,在使用Netty進行TCP消息傳輸時,為了上層協(xié)議能夠對消息正確區(qū)分,避免粘包和拆包導致的問題,一般可以通過消息定長、將回車換行符作為消息結束符,需要的朋友可以參考下2023-12-12

