詳解lambda表達(dá)式foreach性能分析
java 8的新特性之一就是lambda表達(dá)式,parallelStream()都說性能會(huì)比較高,現(xiàn)一探究竟。
話不多說,上代碼:
@Test public void test2(){ List<String> list = new ArrayList<>(); for(int i=0;i<10000;i++) list.add(String.valueOf(i)); //lambda表達(dá)式 long start = System.currentTimeMillis(); // list.parallelStream().forEach((s)->{ // s.toString(); // }); //普通測試 for (Object s :list){ s.toString(); } long end = System.currentTimeMillis(); System.out.println("耗時(shí):"+(end-start) +" ms"); }
測試結(jié)果如下:
普通fo循環(huán)耗時(shí)3ms。
為何lambda表達(dá)式的性能比普通的還差,我猜測是因?yàn)椋簂ist.parallelStream()是并發(fā)處理的,大量的線程上下文切換導(dǎo)致性能下降。如何證明?那就把for循環(huán)里的處理時(shí)間設(shè)置長一點(diǎn)吧,設(shè)置成如下代碼:
public void test1(){ List<String> list = new ArrayList<>(); for(int i=0;i<10000;i++) list.add(String.valueOf(i)); //lambda表達(dá)式 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("耗時(shí):"+(end-start) +" ms"); }
測試結(jié)果:
普通耗時(shí):13454ms
lambda表達(dá)式耗時(shí)3314秒。
果然如老夫所料。
再次驗(yàn)證list.parallelStream()是多線程執(zhí)行, 用visualVM工具看運(yùn)行時(shí)的線程情況,如下:
普通for循環(huán)只有主線程在處理。
lambda表達(dá)式的啟了三個(gè)worker線程處理。
再一次驗(yàn)證了我的想法。
所以結(jié)論是:對于耗時(shí)的操作用lambda表達(dá)式的for循環(huán),如數(shù)據(jù)庫的IO操作,多線程充分利用CPU資源;對于不太耗時(shí)的操作使用普通for循環(huán),比如純CPU計(jì)算類型的操作,單線程性能更高,減少上下文切換的開銷。
到此這篇關(guān)于詳解lambda表達(dá)式foreach性能分析的文章就介紹到這了,更多相關(guān)lambda表達(dá)式foreach性能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01Java8?stream流分組groupingBy的使用方法代碼
對于java8的新特性groupingBy方法,相信有很多人都在工作中用過,這篇文章主要給大家介紹了關(guān)于Java8?stream流分組groupingBy的使用方法,需要的朋友可以參考下2024-01-01java 設(shè)計(jì)模式(DAO)的實(shí)例詳解
這篇文章主要介紹了java 設(shè)計(jì)模式(DAO)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09Java中String字符串轉(zhuǎn)具體對象的幾種常用方式
String對象可以用來存儲任何字符串類型的數(shù)據(jù),包括HTML、XML等格式的字符串,下面這篇文章主要給大家介紹了關(guān)于JavaString字符串轉(zhuǎn)具體對象的幾種常用方式,需要的朋友可以參考下2024-03-03