色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一探究竟Java 8的Stream API性能

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

Stream Performance

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

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

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

一探究竟Java 8的Stream API性能

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

性能測試并不是容易的事,Java 性能測試更費勁,因為虛擬機對性能的影響很大,JVM 對性能的影響有兩方面:

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

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

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

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

實驗一 基本類型迭代

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

測試程序 IntTest,測試結果如下圖:

一探究竟Java 8的Stream API性能

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

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

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

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

一探究竟Java 8的Stream API性能


分析,對于基本類型:

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

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

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

實驗二 對象迭代

再來看對象的迭代效果。

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

測試程序 StringTest,測試結果如下圖:

一探究竟Java 8的Stream API性能


結果分析如下:

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

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

再來單獨考察 Stream 并行迭代效果:

一探究竟Java 8的Stream API性能

分析,對于對象類型:

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

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

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

實驗三 復雜對象歸約

從實驗一、二的結果來看,Stream 串行執(zhí)行的效果都比外部迭代差(很多),是不是說明 Stream 真的不行了?先別下結論,我們再來考察一下更復雜的操作。

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

我們將訂單簡化為構成的元組,并用Order對象來表示。測試程序 ReductionTest,測試結果如下圖:

一探究竟Java 8的Stream API性能

分析,對于復雜的歸約操作:

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

再來考察并行度對并行效果的影響,測試結果如下:

一探究竟Java 8的Stream API性能

分析,對于復雜的歸約操作:

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

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

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

結論

上述三個實驗的結果可以總結如下:

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

對于復雜操作,Stream 串行 API 性能可以和手動實現(xiàn)的效果匹敵,在并行執(zhí)行時 Stream API 效果遠超手動實現(xiàn)。

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

對于簡單操作推薦使用外部迭代手動實現(xiàn),

對于復雜操作,推薦使用 Stream API,

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

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

如果出于代碼簡潔性考慮,使用 Stream API 能夠寫出更短的代碼。即使是從性能方面說,盡可能的使用 Stream API 也另外一個優(yōu)勢,那就是只要 Java Stream 類庫做了升級優(yōu)化,代碼不用做任何修改就能享受到升級帶來的好處。

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

    關注

    19

    文章

    2974

    瀏覽量

    105001
  • API
    API
    +關注

    關注

    2

    文章

    1510

    瀏覽量

    62310
收藏 人收藏

    評論

    相關推薦

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

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

    “密” 不可破?全自動密封性測試儀來一探究竟

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

    Java 23功能介紹

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

    Java集合API的改進介紹

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

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

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

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

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

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

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

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

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現(xiàn)方式上存在些區(qū)別,下面將詳細介紹它們之間的區(qū)別。 1. 功能和用途: – Java
    的頭像 發(fā)表于 07-16 13:35 ?876次閱讀
    華納云:<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,產品力+生態(tài)圈引爆AIoT場景應用

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

    友思特“未來視界”趣味實驗室 | 第講:雞蛋的OCT無損檢測與成像

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

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

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

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

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

    OpenVINO? Java API應用RT-DETR做目標檢測器實戰(zhàn)

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

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

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

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

    光源對機器視覺檢測系統(tǒng)的性能起著重要作用,精確的光學結構設計可以提高捕獲圖像的質量,準確地分離目標和背景信息,不充足的光線會使捕捉到的圖像無法滿足需求,針對不同的檢測對象,不同的形狀光源應運而生
    的頭像 發(fā)表于 02-24 08:33 ?1408次閱讀
    環(huán)形光源讓圖像質量瞬間提升,<b class='flag-5'>一探究竟</b>!
    主站蜘蛛池模板: 精品免费久久久久久影院 | 女人高潮久久久叫人喷水 | 国产精品人妻无码免费A片导航 | 国产精品自拍 | 99久久精品免费看国产一区二区 | 国产日韩久久久精品影院首页 | 良家人妻无码专区九色颜射 | 久久艹综合 | 人人碰在线视频 | 国产精品久久久久久精品... | 啊叫大点声欠CAO的SAO贷 | 成人片免费看 | 手机国产视频福利 | 风车动漫(p)_在线观看官网 | 在线不卡中文字幕 | 好大的太粗好深BL | 高h超辣bl文 | 九热这里只有精品 | 亚洲精品天堂无码中文字幕影院 | 秋霞伦理手机在线看片 | 欧美人禽Zozo动人物杂交 | 免费看www视频 | 亚洲AV精品一区二区三区不卡 | 猫咪av永久最新域名 | 日日操日日射 | 酒色.com | 蜜臀AV99无码精品国产专区 | 天天拍拍国产在线视频 | jk白丝袜美女被男人桶 | 亚洲合集综合久久性色 | 69日本人xxxx16—18 | 国产大片51精品免费观看 | 欧美丰满白嫩bbxx | 性xxx在线观看 | 无人区日本电影在线观看 | 国产亚洲精品久久久久小 | 婷婷激情综合色五月久久竹菊影视 | 男人舔女人的阴部黄色骚虎视频 | 538prom国产在线视频一区 | 三级视频黄色 | 俄罗斯搜索引擎Yandex推广入口 |