欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解lambda表達(dá)式foreach性能分析

 更新時(shí)間:2020年11月06日 10:27:08   作者:shaoyangdd  
這篇文章主要介紹了詳解lambda表達(dá)式foreach性能分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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)文章

  • Java工程師面試題一面二面整理

    Java工程師面試題一面二面整理

    在本篇文章里小編給大家整理的是關(guān)于Java 工程師面試題的相關(guān)知識點(diǎn),有需要的可以參考下。
    2019-08-08
  • Java多線程之Park和Unpark原理

    Java多線程之Park和Unpark原理

    這篇文章主要介紹了Java多線程之Park和Unpark原理,需文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,要的朋友可以參考下
    2021-04-04
  • java 將字符串追加到文件已有內(nèi)容后面的操作

    java 將字符串追加到文件已有內(nèi)容后面的操作

    這篇文章主要介紹了java 將字符串追加到文件已有內(nèi)容后面的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java隨機(jī)字符串生成示例

    java隨機(jī)字符串生成示例

    這篇文章主要介紹了java隨機(jī)字符串生成示例,這個(gè)字符隨機(jī)生成類可以生成多種組合的字符串,比如大+小字符+數(shù)字+符號,需要的朋友可以參考下
    2014-03-03
  • 一文秒懂java到底是值傳遞還是引用傳遞

    一文秒懂java到底是值傳遞還是引用傳遞

    這篇文章主要介紹了java到底是值傳遞還是引用傳遞的相關(guān)知識,本文通過幾個(gè)例子給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法

    mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法

    MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下
    2023-01-01
  • Java中的@SneakyThrows注解詳解

    Java中的@SneakyThrows注解詳解

    這篇文章主要介紹了Java中的@SneakyThrows注解詳解,@SneakyThrows將當(dāng)前方法拋出的異常,包裝成RuntimeException,騙過編譯器,使得調(diào)用點(diǎn)可以不用顯示處理異常信息,需要的朋友可以參考下
    2023-10-10
  • Java8?stream流分組groupingBy的使用方法代碼

    Java8?stream流分組groupingBy的使用方法代碼

    對于java8的新特性groupingBy方法,相信有很多人都在工作中用過,這篇文章主要給大家介紹了關(guān)于Java8?stream流分組groupingBy的使用方法,需要的朋友可以參考下
    2024-01-01
  • java 設(shè)計(jì)模式(DAO)的實(shí)例詳解

    java 設(shè)計(jì)模式(DAO)的實(shí)例詳解

    這篇文章主要介紹了java 設(shè)計(jì)模式(DAO)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java中String字符串轉(zhuǎn)具體對象的幾種常用方式

    Java中String字符串轉(zhuǎn)具體對象的幾種常用方式

    String對象可以用來存儲任何字符串類型的數(shù)據(jù),包括HTML、XML等格式的字符串,下面這篇文章主要給大家介紹了關(guān)于JavaString字符串轉(zhuǎn)具體對象的幾種常用方式,需要的朋友可以參考下
    2024-03-03

最新評論