那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一探究竟Java 8的Stream API性能

汽車玩家 ? 來源:今日頭條 ? 作者:Java的小本家 ? 2020-05-04 14:20 ? 次閱讀

Stream Performance

已經(jīng)對(duì) Stream API 的用法鼓吹夠多了,用起簡潔直觀,但性能到底怎么樣呢?會(huì)不會(huì)有很高的性能損失?

本節(jié)我們對(duì) Stream API 的性能一探究竟。

為保證測(cè)試結(jié)果真實(shí)可信,我們將 JVM 運(yùn)行在-server模式下,測(cè)試數(shù)據(jù)在 GB 量級(jí),測(cè)試機(jī)器采用常見的商用服務(wù)器,配置如下:

一探究竟Java 8的Stream API性能

測(cè)試方法和測(cè)試數(shù)據(jù)

性能測(cè)試并不是容易的事,Java 性能測(cè)試更費(fèi)勁,因?yàn)樘摂M機(jī)對(duì)性能的影響很大,JVM 對(duì)性能的影響有兩方面:

GC 的影響。GC 的行為是 Java 中很不好控制的一塊,為增加確定性,我們手動(dòng)指定使用 CMS 收集器,并使用 10GB 固定大小的堆內(nèi)存。具體到 JVM 參數(shù)就是-XX:+UseConcMarkSweepGC-Xms10G-Xmx10G

JIT(Just-In-Time) 即時(shí)編譯技術(shù)。即時(shí)編譯技術(shù)會(huì)將熱點(diǎn)代碼在 JVM 運(yùn)行的過程中編譯成本地代碼,測(cè)試時(shí)我們會(huì)先對(duì)程序預(yù)熱,觸發(fā)對(duì)測(cè)試函數(shù)的即時(shí)編譯。相關(guān)的 JVM 參數(shù)是-XX:CompileThreshold=10000。

Stream 并行執(zhí)行時(shí)用到ForkJoinPool.commonPool()得到的線程池,為控制并行度我們使用 Linux 的taskset命令指定 JVM 可用的核數(shù)。

測(cè)試數(shù)據(jù)由程序隨機(jī)生成。為防止一次測(cè)試帶來的抖動(dòng),測(cè)試 4 次求出平均時(shí)間作為運(yùn)行時(shí)間。

實(shí)驗(yàn)一 基本類型迭代

測(cè)試內(nèi)容:找出整型數(shù)組中的最小值。對(duì)比 for 循環(huán)外部迭代和 Stream API 內(nèi)部迭代性能。

測(cè)試程序 IntTest,測(cè)試結(jié)果如下圖:

一探究竟Java 8的Stream API性能

圖中展示的是 for 循環(huán)外部迭代耗時(shí)為基準(zhǔn)的時(shí)間比值。分析如下:

對(duì)于基本類型 Stream 串行迭代的性能開銷明顯高于外部迭代開銷(兩倍);

Stream 并行迭代的性能比串行迭代和外部迭代都好。

并行迭代性能跟可利用的核數(shù)有關(guān),上圖中的并行迭代使用了全部 12 個(gè)核,為考察使用核數(shù)對(duì)性能的影響,我們專門測(cè)試了不同核數(shù)下的 Stream 并行迭代效果:

一探究竟Java 8的Stream API性能


分析,對(duì)于基本類型:

使用 Stream 并行 API 在單核情況下性能很差,比 Stream 串行 API 的性能還差;

隨著使用核數(shù)的增加,Stream 并行效果逐漸變好,比使用 for 循環(huán)外部迭代的性能還好。

以上兩個(gè)測(cè)試說明,對(duì)于基本類型的簡單迭代,Stream 串行迭代性能更差,但多核情況下 Stream 迭代時(shí)性能較好。

實(shí)驗(yàn)二 對(duì)象迭代

再來看對(duì)象的迭代效果。

測(cè)試內(nèi)容:找出字符串列表中最小的元素(自然順序),對(duì)比 for 循環(huán)外部迭代和 Stream API 內(nèi)部迭代性能。

測(cè)試程序 StringTest,測(cè)試結(jié)果如下圖:

一探究竟Java 8的Stream API性能


結(jié)果分析如下:

對(duì)于對(duì)象類型 Stream 串行迭代的性能開銷仍然高于外部迭代開銷(1.5 倍),但差距沒有基本類型那么大。

Stream 并行迭代的性能比串行迭代和外部迭代都好。

再來單獨(dú)考察 Stream 并行迭代效果:

一探究竟Java 8的Stream API性能

分析,對(duì)于對(duì)象類型:

使用 Stream 并行 API 在單核情況下性能比 for 循環(huán)外部迭代差;

隨著使用核數(shù)的增加,Stream 并行效果逐漸變好,多核帶來的效果明顯。

以上兩個(gè)測(cè)試說明,對(duì)于對(duì)象類型的簡單迭代,Stream 串行迭代性能更差,但多核情況下 Stream 迭代時(shí)性能較好。

實(shí)驗(yàn)三 復(fù)雜對(duì)象歸約

從實(shí)驗(yàn)一、二的結(jié)果來看,Stream 串行執(zhí)行的效果都比外部迭代差(很多),是不是說明 Stream 真的不行了?先別下結(jié)論,我們?cè)賮砜疾煲幌赂鼜?fù)雜的操作。

測(cè)試內(nèi)容:給定訂單列表,統(tǒng)計(jì)每個(gè)用戶的總交易額。對(duì)比使用外部迭代手動(dòng)實(shí)現(xiàn)和 Stream API 之間的性能。

我們將訂單簡化為構(gòu)成的元組,并用Order對(duì)象來表示。測(cè)試程序 ReductionTest,測(cè)試結(jié)果如下圖:

一探究竟Java 8的Stream API性能

分析,對(duì)于復(fù)雜的歸約操作:

Stream API 的性能普遍好于外部手動(dòng)迭代,并行 Stream 效果更佳;

再來考察并行度對(duì)并行效果的影響,測(cè)試結(jié)果如下:

一探究竟Java 8的Stream API性能

分析,對(duì)于復(fù)雜的歸約操作:

使用 Stream 并行歸約在單核情況下性能比串行歸約以及手動(dòng)歸約都要差,簡單說就是最差的;

隨著使用核數(shù)的增加,Stream 并行效果逐漸變好,多核帶來的效果明顯。

以上兩個(gè)實(shí)驗(yàn)說明,對(duì)于復(fù)雜的歸約操作,Stream 串行歸約效果好于手動(dòng)歸約,在多核情況下,并行歸約效果更佳。我們有理由相信,對(duì)于其他復(fù)雜的操作,Stream API 也能表現(xiàn)出相似的性能表現(xiàn)。

結(jié)論

上述三個(gè)實(shí)驗(yàn)的結(jié)果可以總結(jié)如下:

對(duì)于簡單操作,比如最簡單的遍歷,Stream 串行 API 性能明顯差于顯示迭代,但并行的 Stream API 能夠發(fā)揮多核特性。

對(duì)于復(fù)雜操作,Stream 串行 API 性能可以和手動(dòng)實(shí)現(xiàn)的效果匹敵,在并行執(zhí)行時(shí) Stream API 效果遠(yuǎn)超手動(dòng)實(shí)現(xiàn)。

所以,如果出于性能考慮,

對(duì)于簡單操作推薦使用外部迭代手動(dòng)實(shí)現(xiàn),

對(duì)于復(fù)雜操作,推薦使用 Stream API,

在多核情況下,推薦使用并行 Stream API 來發(fā)揮多核優(yōu)勢(shì),

單核情況下不建議使用并行 Stream API。

如果出于代碼簡潔性考慮,使用 Stream API 能夠?qū)懗龈痰拇a。即使是從性能方面說,盡可能的使用 Stream API 也另外一個(gè)優(yōu)勢(shì),那就是只要 Java Stream 類庫做了升級(jí)優(yōu)化,代碼不用做任何修改就能享受到升級(jí)帶來的好處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2974

    瀏覽量

    105141
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1510

    瀏覽量

    62394
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全金屬航空插頭:工業(yè)領(lǐng)域的“鋼鐵俠”,為何備受青睞?

    在工業(yè)領(lǐng)域的舞臺(tái)上,各種連接元件爭奇斗艷,而全金屬航空插頭猶如位堅(jiān)不可摧的“鋼鐵俠”,以其獨(dú)特的魅力贏得了眾多工程師的青睞。為何全金屬航空插頭能在工業(yè)領(lǐng)域中脫穎而出,成為最受歡迎的連接元件之?讓我們一探究竟
    的頭像 發(fā)表于 12-25 11:46 ?187次閱讀

    “密” 不可破?全自動(dòng)密封性測(cè)試儀來一探究竟

    在現(xiàn)代工業(yè)生產(chǎn)與產(chǎn)品包裝領(lǐng)域,密封性是至關(guān)重要的環(huán)。無論是食品、藥品,還是電子產(chǎn)品等,良好的密封能有效防止泄漏、受潮、氧化以及微生物污染等問題,從而確保產(chǎn)品的質(zhì)量、安全性與保質(zhì)期。而全自動(dòng)密封性
    的頭像 發(fā)表于 12-10 11:48 ?302次閱讀
    “密” 不可破?全自動(dòng)密封性測(cè)試儀來<b class='flag-5'>一探究竟</b>!

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時(shí)適合新的 Java 開發(fā)者和高級(jí)開發(fā)者。從?IntelliJ IDEA 2024.2?開始已支持
    的頭像 發(fā)表于 12-04 10:02 ?358次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    Java集合API的改進(jìn)介紹

    解答這些問題。 我們將逐步學(xué)習(xí) Java 集合類的優(yōu)化過程,并按版本逐對(duì)比分析。主要討論的焦點(diǎn)將包括 JDK 1.0、1.2、1.4、1.5、1.6、1.8、9、10、11 和 21 版本的 Java 集合功能
    的頭像 發(fā)表于 11-22 11:12 ?257次閱讀
    <b class='flag-5'>Java</b>集合<b class='flag-5'>API</b>的改進(jìn)介紹

    使用Arthas火焰圖工具的Java應(yīng)用性能分析和優(yōu)化經(jīng)驗(yàn)

    分享作者在使用Arthas火焰圖工具進(jìn)行Java應(yīng)用性能分析和優(yōu)化的經(jīng)驗(yàn)。
    的頭像 發(fā)表于 10-28 09:27 ?361次閱讀
    使用Arthas火焰圖工具的<b class='flag-5'>Java</b>應(yīng)用<b class='flag-5'>性能</b>分析和優(yōu)化經(jīng)驗(yàn)

    超高頻讀寫器究竟是什么,能做什么?文讀懂!

    在物聯(lián)網(wǎng)技術(shù)日新月異的今天,超高頻讀寫器作為射頻識(shí)別(RFID)技術(shù)的重要組成部分,正逐漸滲透到我們生活的各個(gè)領(lǐng)域。那么,超高頻讀寫器究竟是什么?它又能做些什么呢?本文將帶您一探究竟、超高頻
    的頭像 發(fā)表于 10-23 14:41 ?290次閱讀
    超高頻讀寫器<b class='flag-5'>究竟</b>是什么,能做什么?<b class='flag-5'>一</b>文讀懂!

    插座也有顯示屏?快來一探究竟

    顯示屏智能插座,通過顯示屏實(shí)時(shí)監(jiān)控與可視化展示、智能定時(shí)與提醒、靈活操作與安全保障、節(jié)能環(huán)保,具備高智能化水平,改變用電方式,成為數(shù)字化和智能化時(shí)代的重要橋梁。
    的頭像 發(fā)表于 09-02 15:31 ?413次閱讀
    插座也有顯示屏?快來<b class='flag-5'>一探究竟</b>!

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個(gè)不同的概念,它們?cè)诠δ堋⒂猛竞蛯?shí)現(xiàn)方式上存在些區(qū)別,下面將詳細(xì)介紹它們之間的區(qū)別。 1. 功能和用途: – Java
    的頭像 發(fā)表于 07-16 13:35 ?898次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別

    直擊HDC2024:海思攜手OpenHarmony,產(chǎn)品力+生態(tài)圈引爆AIoT場景應(yīng)用

    海思攜手OpenHarmony,其構(gòu)成的核心競爭力是什么?帶來哪些物聯(lián)網(wǎng)場景體驗(yàn)的提升?海思與OpenHarmony合作有哪些階段性的成果?跟隨電子發(fā)燒友記者的腳步,我們起來海思+OpenHarmony展區(qū)一探究竟
    的頭像 發(fā)表于 06-28 09:15 ?4934次閱讀
    直擊HDC2024:海思攜手OpenHarmony,產(chǎn)品力+生態(tài)圈引爆AIoT場景應(yīng)用

    友思特“未來視界”趣味實(shí)驗(yàn)室 | 第講:雞蛋的OCT無損檢測(cè)與成像

    【全新欄目】友思特實(shí)驗(yàn)室專欄正式成立:歡迎踏入“未來視界趣味實(shí)驗(yàn)室”!我們將以獨(dú)特的視角,帶您探索光電與機(jī)器視覺的奧秘。本期主角:當(dāng)雞蛋碰上OCT成像系統(tǒng),會(huì)呈現(xiàn)怎樣神奇的獨(dú)特視覺效果?歡迎走進(jìn)實(shí)驗(yàn)室一探究竟
    的頭像 發(fā)表于 06-13 14:01 ?534次閱讀
    友思特“未來視界”趣味實(shí)驗(yàn)室 | 第<b class='flag-5'>一</b>講:雞蛋的OCT無損檢測(cè)與成像

    揭秘耐壓儀的電流之謎:直流還是交流?

    在電氣設(shè)備的世界里,耐壓儀是個(gè)重要的角色,它負(fù)責(zé)檢驗(yàn)設(shè)備的絕緣性能是否能夠承受規(guī)定的電壓考驗(yàn)。然而,關(guān)于耐壓儀輸出的是直流(DC)還是交流(AC)的問題,卻鮮為人知。今天,我們就來揭開這神秘的面紗,
    的頭像 發(fā)表于 04-11 08:50 ?1133次閱讀
    揭秘耐壓儀的電流之謎:直流還是交流?

    5.5G,多出來的0.5G又是啥?為什么不直接邁向6G時(shí)代?

    5.5G成為通信行業(yè)2024年開年的大焦點(diǎn)。提到5.5G,多出來的0.5G又是啥?為什么不直接邁向6G時(shí)代?今天我們一探究竟
    的頭像 發(fā)表于 04-03 09:40 ?747次閱讀

    OpenVINO? Java API應(yīng)用RT-DETR做目標(biāo)檢測(cè)器實(shí)戰(zhàn)

    本文將從零開始詳細(xì)介紹環(huán)境搭建的完整步驟,我們基于英特爾開發(fā)套件AIxBoard為硬件基礎(chǔ)實(shí)現(xiàn)了Java在Ubuntu 22.04系統(tǒng)上成功使用OpenVINO? Java API,并且成功運(yùn)行了RT-DETR實(shí)現(xiàn)實(shí)時(shí)端到端目標(biāo)
    的頭像 發(fā)表于 03-18 15:04 ?876次閱讀
    OpenVINO? <b class='flag-5'>Java</b> <b class='flag-5'>API</b>應(yīng)用RT-DETR做目標(biāo)檢測(cè)器實(shí)戰(zhàn)

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序的效率和性能,使得程序可以同時(shí)處理多個(gè)任務(wù)。 Jav
    的頭像 發(fā)表于 03-14 16:55 ?782次閱讀

    環(huán)形光源讓圖像質(zhì)量瞬間提升,一探究竟

    光源對(duì)機(jī)器視覺檢測(cè)系統(tǒng)的性能起著重要作用,精確的光學(xué)結(jié)構(gòu)設(shè)計(jì)可以提高捕獲圖像的質(zhì)量,準(zhǔn)確地分離目標(biāo)和背景信息,不充足的光線會(huì)使捕捉到的圖像無法滿足需求,針對(duì)不同的檢測(cè)對(duì)象,不同的形狀光源應(yīng)運(yùn)而生
    的頭像 發(fā)表于 02-24 08:33 ?1417次閱讀
    環(huán)形光源讓圖像質(zhì)量瞬間提升,<b class='flag-5'>一探究竟</b>!
    百家乐群详解包杀| 飞天百家乐官网的玩法技巧和规则| 大发888东方鸿运娱乐| 十六浦百家乐官网的玩法技巧和规则 | 百家乐套利| 属狗与属龙做生意好吗| 百家乐官网网上赌博| 莫斯科百家乐的玩法技巧和规则| 赌博百家乐官网的玩法技巧和规则 | 十六浦娱乐城信誉| 百家乐官方游戏下载| 淘金百家乐官网的玩法技巧和规则| 天水市| 永利高投注网哪个好| 百家乐哪家信誉好| 百家乐官网赌博分析网| 德州扑克现金桌视频| 百家乐高命中打法| 英皇百家乐官网的玩法技巧和规则 | 缅甸百家乐官网网站是多少| 大发888是什么| 百家乐全讯网娱乐城| 百家乐官网新注册送彩金| 罗源县| 大发888娱乐城下载地址| 百家乐赌博外挂| 逍遥坊百家乐官网的玩法技巧和规则 | 大发888开户注册| 百家乐mediacorp| 千亿娱百家乐官网的玩法技巧和规则| 正规百家乐官网游戏下载| 优博网址| 威尼斯人娱乐城真人百家乐| 赌博百家乐弱点| 足球百家乐官网系统| 真人百家乐官网攻略| 来安县| 12bet存款| 菲律宾太阳城网| 试玩百家乐代理| 百家乐群柏拉图软件|