国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

為什么list.sort()比Stream().sorted()更快?

來源: 責編: 時間:2023-09-18 21:41:46 404觀看
導讀看到一個評論,里面提到了list.sort()和list.strem().sorted()排序的差異。說到list.sort()排序比stream().sorted()排序性能更好。但沒說到為什么。有朋友也提到了這一點。本文重新開始,先問是不是,再問為什么。真的更好

看到一個評論,里面提到了list.sort()和list.strem().sorted()排序的差異。WDK28資訊網——每日最新資訊28at.com

說到list.sort()排序比stream().sorted()排序性能更好。WDK28資訊網——每日最新資訊28at.com

但沒說到為什么。WDK28資訊網——每日最新資訊28at.com

WDK28資訊網——每日最新資訊28at.com

有朋友也提到了這一點。WDK28資訊網——每日最新資訊28at.com

本文重新開始,先問是不是,再問為什么。WDK28資訊網——每日最新資訊28at.com

真的更好嗎?

先簡單寫個 demo。WDK28資訊網——每日最新資訊28at.com

List<Integer> userList = new ArrayList<>();    Random rand = new Random();    for (int i = 0; i < 10000 ; i++) {        userList.add(rand.nextInt(1000));    }    List<Integer> userList2 = new ArrayList<>();    userList2.addAll(userList);    Long startTime1 = System.currentTimeMillis();    userList2.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList());    System.out.println("stream.sort耗時:"+(System.currentTimeMillis() - startTime1)+"ms");    Long startTime = System.currentTimeMillis();    userList.sort(Comparator.comparing(Integer::intValue));    System.out.println("List.sort()耗時:"+(System.currentTimeMillis()-startTime)+"ms");

輸出:WDK28資訊網——每日最新資訊28at.com

stream.sort耗時:62msList.sort()耗時:7ms

由此可見 list 原生排序性能更好。WDK28資訊網——每日最新資訊28at.com

能證明嗎?WDK28資訊網——每日最新資訊28at.com

不一定吧。WDK28資訊網——每日最新資訊28at.com

再把 demo 變換一下,先輸出stream.sort。WDK28資訊網——每日最新資訊28at.com

List<Integer> userList = new ArrayList<>();Random rand = new Random();for (int i = 0; i < 10000 ; i++) {    userList.add(rand.nextInt(1000));}List<Integer> userList2 = new ArrayList<>();userList2.addAll(userList);Long startTime = System.currentTimeMillis();userList.sort(Comparator.comparing(Integer::intValue));System.out.println("List.sort()耗時:"+(System.currentTimeMillis()-startTime)+"ms");Long startTime1 = System.currentTimeMillis();userList2.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList());System.out.println("stream.sort耗時:"+(System.currentTimeMillis() - startTime1)+"ms");

此時輸出變成了:WDK28資訊網——每日最新資訊28at.com

List.sort()耗時:68msstream.sort耗時:13ms

這能證明上面的結論錯誤了嗎?WDK28資訊網——每日最新資訊28at.com

都不能。WDK28資訊網——每日最新資訊28at.com

兩種方式都不能證明到底誰更快。WDK28資訊網——每日最新資訊28at.com

使用這種方式在很多場景下是不夠的,某些場景下,JVM 會對代碼進行 JIT 編譯和內聯優化。WDK28資訊網——每日最新資訊28at.com

Long startTime = System.currentTimeMillis();...System.currentTimeMillis() - startTime

此時,代碼優化前后執行的結果就會非常大。WDK28資訊網——每日最新資訊28at.com

基準測試是指通過設計科學的測試方法、測試工具和測試系統,實現對一類測試對象的某項性能指標進行定量的和可對比的測試。WDK28資訊網——每日最新資訊28at.com

基準測試使得被測試代碼獲得足夠預熱,讓被測試代碼得到充分的 JIT 編譯和優化。WDK28資訊網——每日最新資訊28at.com

下面是通過 JMH 做一下基準測試,分別測試集合大小在 100,10000,100000 時兩種排序方式的性能差異。WDK28資訊網——每日最新資訊28at.com

import org.openjdk.jmh.annotations.*;import org.openjdk.jmh.infra.Blackhole;import org.openjdk.jmh.results.format.ResultFormatType;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.RunnerException;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;import java.util.*;import java.util.concurrent.ThreadLocalRandom;import java.util.concurrent.TimeUnit;import java.util.stream.Collectors;@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)@Warmup(iterations = 2, time = 1)@Measurement(iterations = 5, time = 5)@Fork(1)@State(Scope.Thread)public class SortBenchmark {    @Param(value = {"100", "10000", "100000"})    private int operationSize;     private static List<Integer> arrayList;    public static void main(String[] args) throws RunnerException {        // 啟動基準測試        Options opt = new OptionsBuilder()            .include(SortBenchmark.class.getSimpleName())             .result("SortBenchmark.json")            .mode(Mode.All)            .resultFormat(ResultFormatType.JSON)            .build();        new Runner(opt).run();     }    @Setup    public void init() {        arrayList = new ArrayList<>();        Random random = new Random();        for (int i = 0; i < operationSize; i++) {            arrayList.add(random.nextInt(10000));        }    }    @Benchmark    public void sort(Blackhole blackhole) {        arrayList.sort(Comparator.comparing(e -> e));        blackhole.consume(arrayList);    }    @Benchmark    public void streamSorted(Blackhole blackhole) {        arrayList = arrayList.stream().sorted(Comparator.comparing(e -> e)).collect(Collectors.toList());        blackhole.consume(arrayList);    }}

性能測試結果:WDK28資訊網——每日最新資訊28at.com

WDK28資訊網——每日最新資訊28at.com

可以看到,list.sort()效率確實比stream().sorted()要好。WDK28資訊網——每日最新資訊28at.com

為什么更好?WDK28資訊網——每日最新資訊28at.com

流本身的損耗

java 的 stream 讓我們可以在應用層就可以高效地實現類似數據庫 SQL 的聚合操作了,它可以讓代碼更加簡潔優雅。WDK28資訊網——每日最新資訊28at.com

但是,假設我們要對一個 list 排序,得先把 list 轉成 stream 流,排序完成后需要將數據收集起來重新形成 list,這部份額外的開銷有多大呢?WDK28資訊網——每日最新資訊28at.com

我們可以通過以下代碼來進行基準測試:WDK28資訊網——每日最新資訊28at.com

import org.openjdk.jmh.annotations.*;import org.openjdk.jmh.infra.Blackhole;import org.openjdk.jmh.results.format.ResultFormatType;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.RunnerException;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Random;import java.util.concurrent.TimeUnit;import java.util.stream.Collectors;@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)@Warmup(iterations = 2, time = 1)@Measurement(iterations = 5, time = 5)@Fork(1)@State(Scope.Thread)public class SortBenchmark3 {    @Param(value = {"100", "10000"})    private int operationSize; // 操作次數    private static List<Integer> arrayList;    public static void main(String[] args) throws RunnerException {        // 啟動基準測試        Options opt = new OptionsBuilder()            .include(SortBenchmark3.class.getSimpleName()) // 要導入的測試類            .result("SortBenchmark3.json")            .mode(Mode.All)            .resultFormat(ResultFormatType.JSON)            .build();        new Runner(opt).run(); // 執行測試    }    @Setup    public void init() {        // 啟動執行事件        arrayList = new ArrayList<>();        Random random = new Random();        for (int i = 0; i < operationSize; i++) {            arrayList.add(random.nextInt(10000));        }    }    @Benchmark    public void stream(Blackhole blackhole) {        arrayList.stream().collect(Collectors.toList());        blackhole.consume(arrayList);    }    @Benchmark    public void sort(Blackhole blackhole) {        arrayList.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList());        blackhole.consume(arrayList);    }}

方法 stream 測試將一個集合轉為流再收集回來的耗時。WDK28資訊網——每日最新資訊28at.com

方法 sort 測試將一個集合轉為流再排序再收集回來的全過程耗時。WDK28資訊網——每日最新資訊28at.com

測試結果如下:WDK28資訊網——每日最新資訊28at.com

WDK28資訊網——每日最新資訊28at.com

可以發現,集合轉為流再收集回來的過程,肯定會耗時,但是它占全過程的比率并不算高。WDK28資訊網——每日最新資訊28at.com

因此,這部只能說是小部份的原因。WDK28資訊網——每日最新資訊28at.com

排序過程

我們可以通過以下源碼很直觀的看到。WDK28資訊網——每日最新資訊28at.com

WDK28資訊網——每日最新資訊28at.com

  • 1 begin方法初始化一個數組。
  • 2 accept 接收上游數據。
  • 3 end 方法開始進行排序。

這里第 3 步直接調用了原生的排序方法,完成排序后,第 4 步,遍歷向下游發送數據。WDK28資訊網——每日最新資訊28at.com

所以通過源碼,我們也能很明顯地看到,stream()排序所需時間肯定是 > 原生排序時間。WDK28資訊網——每日最新資訊28at.com

只不過,這里要量化地搞明白,到底多出了多少,這里得去編譯 jdk 源碼,在第 3 步前后將時間打印出來。WDK28資訊網——每日最新資訊28at.com

這一步我就不做了。WDK28資訊網——每日最新資訊28at.com

感興趣的朋友可以去測一下。WDK28資訊網——每日最新資訊28at.com

不過我覺得這兩點也能很好地回答,為什么list.sort()比Stream().sorted()更快。WDK28資訊網——每日最新資訊28at.com

補充說明:WDK28資訊網——每日最新資訊28at.com

  • 本文說的 stream() 流指的是串行流,而不是并行流。
  • 絕大多數場景下,幾百幾千幾萬的數據,開心就好,怎么方便怎么用,沒有必要去計較這點性能差異。

本文鏈接:http://m.rrqrq.com/showinfo-26-10468-0.html為什么list.sort()比Stream().sorted()更快?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++中表達式的必要性

下一篇: 分布式事務原理及解決方案

標簽:
  • 熱門焦點
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
免费高清不卡av| 亚洲国产成人一区二区三区| 五月天亚洲精品| 亚洲国产精品一区| 欧美午夜精品理论片a级按摩| 欧美熟乱第一页| 亚洲综合成人在线视频| 男人的天堂亚洲一区| 亚洲性感激情| 一区二区在线观看免费视频播放| 麻豆精品久久精品色综合| 久久久人人人| 亚洲精品午夜久久久| 欧美另类亚洲| 欧美日韩国产片| 国产成人av电影在线播放| 欧美一区二区三区啪啪| 亚洲天堂久久久久久久| 亚洲国产免费| 亚洲尤物视频在线| 亚洲欧美bt| 麻豆成人av在线| 91麻豆精品国产自产在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 一本一道波多野结衣一区二区| 亚洲一区二区精品视频| 99成人在线| 蜜臀va亚洲va欧美va天堂| 日韩视频免费直播| 欧美国产高潮xxxx1819| 亚洲嫩草精品久久| 久久精品国产清高在天天线 | 国产精品资源网站| 国产清纯白嫩初高生在线观看91| 欧美日韩视频| 久久精品噜噜噜成人av农村| 国产偷国产偷亚洲高清人白洁 | 日韩情涩欧美日韩视频| 一本色道88久久加勒比精品| 日本不卡中文字幕| 亚洲色图视频网站| 精品国精品国产| 噜噜噜91成人网| 国产成人精品一区二| 国产偷国产偷亚洲高清人白洁| 亚洲免费激情| 成人高清视频在线观看| 一区二区三区成人| 久久综合久久综合九色| 久久伊人一区二区| 韩国一区二区三区美女美女秀| 国产成人亚洲精品狼色在线| 一区二区三区免费网站| 精品88久久久久88久久久| 欧美老年两性高潮| av色综合久久天堂av综合| 亚洲综合色婷婷| 国产精品欧美经典| 精品日韩在线一区| 日韩一区二区高清| 欧美浪妇xxxx高跟鞋交| 欧美视频一二三区| 国产日产精品一区二区三区四区的观看方式 | 国产麻豆精品在线观看| 亚洲a一区二区| 亚洲国产毛片aaaaa无费看| 亚洲丝袜美腿综合| 中文字幕中文乱码欧美一区二区 | 4438成人网| 91精品欧美久久久久久动漫| 欧美日本一区二区| 欧美区一区二区三区| 91精品国产综合久久福利软件| 欧美日韩国产在线播放网站| 精品视频色一区| 日韩欧美资源站| 日韩美女一区二区三区| 久久精品欧美一区二区三区麻豆| 国产亚洲成年网址在线观看| 亚洲欧洲性图库| 日韩影视精彩在线| 久久99精品久久久| 成人动漫视频在线| 伊人久久亚洲美女图片| 久久久久久九九九九| 69久久99精品久久久久婷婷| 欧美一区二区美女| 一区二区三区在线看| 91啪亚洲精品| 日韩视频免费观看高清完整版在线观看 | 国产成人日日夜夜| 欧美久久久久| 久久精品成人| 亚洲一区二三| 精品国产一区二区三区四区四| 国产午夜亚洲精品午夜鲁丝片| 亚洲色图清纯唯美| 韩国一区二区在线观看| 99riav一区二区三区| 国产一级精品aaaaa看| 欧美三级乱人伦电影| 国产精品色婷婷久久58| 日韩av电影免费观看高清完整版| 国产一区二区在线观看免费| 国产欧美综合一区二区三区| 精品视频在线免费看| 国产精品三级av| 精品亚洲欧美一区| 国语自产精品视频在线看抢先版结局 | 99热精品国产| 丁香天五香天堂综合| 2017欧美狠狠色| 国产亚洲精品精华液| 欧美午夜精品久久久久久孕妇| 91麻豆精品国产91久久久更新时间| 欧美日韩国产a| 亚洲国产成人porn| 亚洲午夜精品国产| 久久伊人中文字幕| 久久国产精品99久久人人澡| 欧美亚洲自偷自偷| 1区2区3区欧美| 91视频在线看| 精品国内片67194| 国产不卡一区视频| 在线观看av不卡| 亚洲黄色三级| 日韩一卡二卡三卡| 久久99精品国产麻豆婷婷| 欧美综合久久久| 老司机免费视频一区二区三区| 欧美综合二区| 亚洲丶国产丶欧美一区二区三区| 亚洲美女视频在线免费观看| 一区二区三区视频在线观看| 国产日韩欧美一区二区三区在线观看| 精品国产乱码久久久久久久久| 国产成人在线免费观看| 精品视频色一区| 日本不卡不码高清免费观看| 一本色道久久综合精品竹菊| 欧美国产高清| 亚洲综合一区在线| 亚洲免费观看| 中文字幕在线不卡一区| 欧美精品在欧美一区二区少妇| 美国毛片一区二区三区| 91精品国产美女浴室洗澡无遮挡| 国内精品视频一区二区三区八戒| 亚洲青涩在线| 国产suv一区二区三区88区| 日本一区二区高清| 亚洲免费综合| 成人黄色av电影| 美国三级日本三级久久99| 久久精品视频一区| 色综合激情五月| 国产高清在线精品| 亚洲一区二区四区蜜桃| 欧美精品色一区二区三区| 国产精品国产精品| 国产一区二区视频在线播放| 久久综合九色综合久久久精品综合 | 日韩综合在线视频| 日韩欧美在线影院| 欧美日韩亚洲一区| 亚洲午夜三级在线| 中文字幕av一区 二区| 在线观看一区二区视频| 欧美一区免费| 国内精品国产成人国产三级粉色| 亚洲国产精品人人做人人爽| 久久精品在线观看| 在线观看国产一区二区| 亚洲激情成人| 亚洲人www| 亚洲婷婷在线| 欧美日韩一卡| 三级一区在线视频先锋| 成人欧美一区二区三区白人| 精品国产乱码久久久久久久| 欧美日韩中文一区| 久久网站免费| 亚洲精选成人| 国产美女精品| 国产亚洲午夜| 在线观看免费一区| 欧美一区二区日韩一区二区| 欧美麻豆精品久久久久久| 国产一区二区三区免费观看| 国产精品一级二级三级| 国产精品一区二区三区99| jizzjizzjizz欧美| 国产91丝袜在线播放| 捆绑变态av一区二区三区| 91老师国产黑色丝袜在线| 欧美精品99| 成人黄色在线视频| 国产精品久久久久影院色老大 | 久久er99热精品一区二区|