精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開(kāi)發(fā) 測(cè)試
本文主要介紹關(guān)于 list.sort() 和 list.strem().sorted() 排序的差異,到底哪個(gè)性能更好一些。

看到一個(gè)評(píng)論,里面提到了list.sort()和list.strem().sorted()排序的差異。

說(shuō)到list.sort()排序比stream().sorted()排序性能更好。

但沒(méi)說(shuō)到為什么。

有朋友也提到了這一點(diǎn)。

本文重新開(kāi)始,先問(wèn)是不是,再問(wèn)為什么。

真的更好嗎?

先簡(jiǎn)單寫(xiě)個(gè) demo。

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耗時(shí):"+(System.currentTimeMillis() - startTime1)+"ms");

    Long startTime = System.currentTimeMillis();
    userList.sort(Comparator.comparing(Integer::intValue));
    System.out.println("List.sort()耗時(shí):"+(System.currentTimeMillis()-startTime)+"ms");

輸出:

stream.sort耗時(shí):62ms
List.sort()耗時(shí):7ms

由此可見(jiàn) list 原生排序性能更好。

能證明嗎?

不一定吧。

再把 demo 變換一下,先輸出stream.sort。

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()耗時(shí):"+(System.currentTimeMillis()-startTime)+"ms");

Long startTime1 = System.currentTimeMillis();
userList2.stream().sorted(Comparator.comparing(Integer::intValue)).collect(Collectors.toList());
System.out.println("stream.sort耗時(shí):"+(System.currentTimeMillis() - startTime1)+"ms");

此時(shí)輸出變成了:

List.sort()耗時(shí):68ms
stream.sort耗時(shí):13ms

這能證明上面的結(jié)論錯(cuò)誤了嗎?

都不能。

兩種方式都不能證明到底誰(shuí)更快。

使用這種方式在很多場(chǎng)景下是不夠的,某些場(chǎng)景下,JVM 會(huì)對(duì)代碼進(jìn)行 JIT 編譯和內(nèi)聯(lián)優(yōu)化。

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

此時(shí),代碼優(yōu)化前后執(zhí)行的結(jié)果就會(huì)非常大。

基準(zhǔn)測(cè)試是指通過(guò)設(shè)計(jì)科學(xué)的測(cè)試方法、測(cè)試工具和測(cè)試系統(tǒng),實(shí)現(xiàn)對(duì)一類(lèi)測(cè)試對(duì)象的某項(xiàng)性能指標(biāo)進(jìn)行定量的和可對(duì)比的測(cè)試。

基準(zhǔn)測(cè)試使得被測(cè)試代碼獲得足夠預(yù)熱,讓被測(cè)試代碼得到充分的 JIT 編譯和優(yōu)化。

下面是通過(guò) JMH 做一下基準(zhǔn)測(cè)試,分別測(cè)試集合大小在 100,10000,100000 時(shí)兩種排序方式的性能差異。

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 {
        // 啟動(dòng)基準(zhǔn)測(cè)試
        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);
    }
}

性能測(cè)試結(jié)果:

可以看到,list.sort()效率確實(shí)比stream().sorted()要好。

為什么更好?

流本身的損耗

java 的 stream 讓我們可以在應(yīng)用層就可以高效地實(shí)現(xiàn)類(lèi)似數(shù)據(jù)庫(kù) SQL 的聚合操作了,它可以讓代碼更加簡(jiǎn)潔優(yōu)雅。

但是,假設(shè)我們要對(duì)一個(gè) list 排序,得先把 list 轉(zhuǎn)成 stream 流,排序完成后需要將數(shù)據(jù)收集起來(lái)重新形成 list,這部份額外的開(kāi)銷(xiāo)有多大呢?

我們可以通過(guò)以下代碼來(lái)進(jìn)行基準(zhǔn)測(cè)試:

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; // 操作次數(shù)
    private static List<Integer> arrayList;
    public static void main(String[] args) throws RunnerException {
        // 啟動(dòng)基準(zhǔn)測(cè)試
        Options opt = new OptionsBuilder()
            .include(SortBenchmark3.class.getSimpleName()) // 要導(dǎo)入的測(cè)試類(lèi)
            .result("SortBenchmark3.json")
            .mode(Mode.All)
            .resultFormat(ResultFormatType.JSON)
            .build();
        new Runner(opt).run(); // 執(zhí)行測(cè)試
    }

    @Setup
    public void init() {
        // 啟動(dòng)執(zhí)行事件
        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 測(cè)試將一個(gè)集合轉(zhuǎn)為流再收集回來(lái)的耗時(shí)。

方法 sort 測(cè)試將一個(gè)集合轉(zhuǎn)為流再排序再收集回來(lái)的全過(guò)程耗時(shí)。

測(cè)試結(jié)果如下:

可以發(fā)現(xiàn),集合轉(zhuǎn)為流再收集回來(lái)的過(guò)程,肯定會(huì)耗時(shí),但是它占全過(guò)程的比率并不算高。

因此,這部只能說(shuō)是小部份的原因。

排序過(guò)程

我們可以通過(guò)以下源碼很直觀的看到。

  • 1 begin方法初始化一個(gè)數(shù)組。
  • 2 accept 接收上游數(shù)據(jù)。
  • 3 end 方法開(kāi)始進(jìn)行排序。

這里第 3 步直接調(diào)用了原生的排序方法,完成排序后,第 4 步,遍歷向下游發(fā)送數(shù)據(jù)。

所以通過(guò)源碼,我們也能很明顯地看到,stream()排序所需時(shí)間肯定是 > 原生排序時(shí)間。

只不過(guò),這里要量化地搞明白,到底多出了多少,這里得去編譯 jdk 源碼,在第 3 步前后將時(shí)間打印出來(lái)。

這一步我就不做了。

感興趣的朋友可以去測(cè)一下。

不過(guò)我覺(jué)得這兩點(diǎn)也能很好地回答,為什么list.sort()比Stream().sorted()更快。

補(bǔ)充說(shuō)明:

  • 本文說(shuō)的 stream() 流指的是串行流,而不是并行流。
  • 絕大多數(shù)場(chǎng)景下,幾百幾千幾萬(wàn)的數(shù)據(jù),開(kāi)心就好,怎么方便怎么用,沒(méi)有必要去計(jì)較這點(diǎn)性能差異。
責(zé)任編輯:趙寧寧 來(lái)源: 技術(shù)老男孩
相關(guān)推薦

2021-11-05 07:13:46

Python

2021-01-13 10:51:08

PromissetTimeout(函數(shù)

2020-11-09 10:01:29

Python乘法位運(yùn)算

2024-10-28 21:11:52

2022-04-28 12:00:34

Go泛型版排序

2025-09-22 08:12:57

2024-02-22 15:31:46

Python排序

2014-08-29 09:56:47

排序數(shù)組編程技巧

2022-11-10 15:32:29

2019-09-16 12:00:03

constC編程語(yǔ)言

2015-07-31 16:29:15

DockerJavaLinux

2019-04-24 08:00:00

HTTPSHTTP前端

2021-12-27 07:10:26

ClassmethodStaticmetho函數(shù)

2016-12-14 12:02:01

StormHadoop大數(shù)據(jù)

2017-02-14 14:20:02

StormHadoop

2020-09-19 17:59:21

sorted()Python函數(shù)

2023-09-20 00:06:30

Python代碼函數(shù)

2024-06-26 10:50:35

2013-08-15 10:05:16

代碼

2024-08-19 00:10:05

RocketMQ應(yīng)用SDK
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产综合精品久久久久成人av| 国产午夜福利100集发布| 国产精品爽爽久久| 18成人免费观看视频| 日韩精品中文在线观看| 邪恶网站在线观看| 七七成人影院| 国产日韩欧美在线一区| 99在线高清视频在线播放| 中文字幕视频网站| 婷婷另类小说| 亚洲欧美日本精品| 中文字幕乱码在线人视频| 唐人社导航福利精品| 亚洲色图19p| 青青草原成人| 日韩一区二区三区在线观看视频| 免费观看成人av| 91国产一区在线| 天天综合天天做| av影片在线一区| 亚洲成人久久久久| 日韩成人av免费| 国产另类xxxxhd高清| 亚洲444eee在线观看| 四虎免费在线观看视频| 国产一级免费在线观看| 波多野结衣中文字幕一区二区三区| 国产美女91呻吟求| 精人妻无码一区二区三区| 精品9999| 久久久视频精品| 疯狂试爱三2浴室激情视频| 九九视频免费观看视频精品 | 中文字幕人妻色偷偷久久| 激情欧美日韩| 色综合男人天堂| www欧美com| 天天影视天天精品| 亚洲最新视频在线| 久久这里只精品| 国产高清视频色在线www| 亚洲一级二级在线| 99er在线视频| 在线视频国产区| 日韩美女视频一区二区| 伊人久久青草| 免费av在线| 国产精品国产三级国产三级人妇| 亚洲美女网站18| 成人资源www网在线最新版| 91色综合久久久久婷婷| 久久国产主播精品| 外国精品视频在线观看 | 国产盗摄视频在线观看| 91caoporm在线视频| 国产日产欧美一区二区视频| 欧美一区激情视频在线观看| 黄色软件在线观看| 国产欧美日韩综合精品一区二区| 先锋影音日韩| 欧美激情午夜| 亚洲精品国产无天堂网2021| 黄色特一级视频| sis001亚洲原创区| 精品久久久久久亚洲精品| www.亚洲天堂网| 欧美大片免费高清观看| 欧美三区免费完整视频在线观看| 一本色道久久亚洲综合精品蜜桃| 免费成人毛片| 日韩欧美国产小视频| 中文字幕在线视频播放| 日本午夜精品| 中文字幕精品网| 久久久久亚洲AV成人| 亚洲天堂一区二区三区四区| 久久久久久久久久久成人| 中文字幕免费在线观看视频| 秋霞电影一区二区| 91手机在线观看| 天堂在线视频网站| 国产欧美一区在线| 国产欧美自拍视频| 亚洲精品88| 欧美疯狂做受xxxx富婆| 精品少妇人妻av一区二区三区| 窝窝社区一区二区| 日韩亚洲综合在线| av资源吧首页| 日韩黄色免费网站| 亚洲专区国产精品| 你懂的好爽在线观看| 亚洲欧美在线视频| 日本三级免费网站| 视频欧美精品| 亚洲男人第一网站| 日本黄色片免费观看| 亚洲在线日韩| 91精品一区二区| 日本a一级在线免费播放| 中文字幕在线不卡国产视频| 亚洲 欧美 日韩 国产综合 在线| 欧美日韩国产网站| 精品动漫一区二区三区在线观看| 黄色三级生活片| 亚洲精品社区| 亚洲一区免费网站| av在线中文| 偷偷要91色婷婷| 亚洲第一成肉网| 国产一区二区三区四区五区传媒| 欧美日韩成人在线播放| 做爰无遮挡三级| www.一区二区| 亚洲天堂第一区| 色综合.com| 亚洲人成电影在线播放| 国产真实乱人偷精品视频| 美女www一区二区| 久久久久久久久久码影片| 宅男在线观看免费高清网站| 欧美无乱码久久久免费午夜一区| 一级做a爰片毛片| 欧美视频导航| 亚洲a级在线播放观看| 福利在线午夜| 色综合天天性综合| 熟妇人妻久久中文字幕| 亚洲小说欧美另类社区| 川上优av一区二区线观看| 在线观看二区| 在线观看三级视频欧美| 国产肉体xxxx裸体784大胆| 欧美视频导航| 国产精品加勒比| 91精选在线| 91精品婷婷国产综合久久竹菊| 2019男人天堂| 奇米影视一区二区三区| 婷婷久久五月天| 日韩网站中文字幕| 一区二区亚洲精品国产| 天天爱天天做天天爽| 久久久久久久久久久久久夜| 久久久久久久激情| 伊人久久大香线蕉综合网站| 欧美重口另类videos人妖| 亚洲三级黄色片| 欧美日韩美女在线观看| jlzzjizz在线播放观看| 日韩一级免费| 欧美成人dvd在线视频| 亚洲欧洲自拍| 亚洲片国产一区一级在线观看| 精品人妻一区二区色欲产成人| 久久这里只有精品6| 黄色片一级视频| 欧美熟乱15p| 国产精品永久免费观看| 成人日韩欧美| 日韩精品一区国产麻豆| 日韩精品一区三区| 久久综合色一综合色88| 97公开免费视频| 小小影院久久| 黑人另类av| 欧洲亚洲两性| 久久国产一区二区三区| 97在线视频人妻无码| 一区二区三区日韩欧美| 日韩综合第一页| 日韩精品亚洲一区| 国产又大又长又粗又黄| 激情亚洲另类图片区小说区| 青草青草久热精品视频在线网站| 69视频在线观看| 日韩欧美一卡二卡| 无码人妻av一区二区三区波多野| 中文字幕成人av| 麻豆网站免费观看| 中日韩男男gay无套| 水蜜桃亚洲一二三四在线| 日韩三级成人| 欧美激情精品久久久久久久变态 | 成人在线视频一区二区| 18禁网站免费无遮挡无码中文| 国产精品探花在线观看| 亚洲aⅴ日韩av电影在线观看| 超碰99在线| 爽爽爽爽爽爽爽成人免费观看| 91精品国产一区二区三区动漫| 午夜视频在线免费播放| 欧美三级视频在线观看| 国产亚洲精品成人| 国产拍欧美日韩视频二区| 手机在线观看日韩av| 久久久精品日韩| 美女黄色免费看| 国产一区三区在线播放| 成人av资源网| 粉嫩av一区二区三区四区五区 | 黄色精品视频| 97久久超碰福利国产精品…| 免费a级毛片在线播放| 日韩国产欧美精品一区二区三区| 91禁在线观看| 色综合 综合色| 精品视频在线观看免费| 国产精品盗摄一区二区三区| 少妇大叫太粗太大爽一区二区| 国产乱妇无码大片在线观看| 精品久久久久久久免费人妻| 国产精品啊啊啊| 一区二区三区四区五区视频| 你微笑时很美电视剧整集高清不卡| 91色在线观看| 成人免费黄色| 欧美在线视频免费观看| 人人澡人人添人人爽一区二区| 色午夜这里只有精品| 经典三级在线| 国产视频丨精品|在线观看| 亚洲成人一级片| 91精品视频网| 在线观看中文字幕网站| 一本色道久久综合精品竹菊| 国产视频91在线| 亚洲一区二区精品视频| 极品颜值美女露脸啪啪| 中文字幕一区免费在线观看| 91成人在线免费视频| 99久精品国产| 亚洲av成人无码一二三在线观看| 成人国产一区二区三区精品| 无码人妻一区二区三区一| 国产在线不卡一卡二卡三卡四卡| www.com黄色片| 蜜臀久久久99精品久久久久久| www.亚洲天堂网| 视频一区视频二区中文| 人妻有码中文字幕| 亚洲欧美日韩精品一区二区| 国产中文字幕视频在线观看| 最新亚洲视频| 免费无遮挡无码永久视频| 中文亚洲字幕| 中文字幕无码不卡免费视频| 久久精品麻豆| www.激情小说.com| 精品一区二区三区在线观看国产 | 成人精品视频.| 稀缺呦国内精品呦| gogogo免费视频观看亚洲一| 欧美在线一级片| 久久免费电影网| 精品国产aaa| 亚洲日本成人在线观看| 东方av正在进入| 亚洲一区二区在线视频| 久久精品视频久久| 精品久久久久久久久久久| 日韩在线播放中文字幕| 欧美色图天堂网| 99久久免费国产精精品| 精品免费视频一区二区| 桃花色综合影院| 中文在线不卡视频| 香蕉久久aⅴ一区二区三区| 久久久噜噜噜久久中文字免| 亚洲优女在线| 国产欧美日韩视频| 2020最新国产精品| 欧美xxxx黑人又粗又长精品| 欧美色爱综合| 99re6这里有精品热视频| 亚洲激情亚洲| 15—17女人毛片| 国产成人精品一区二区三区四区| 黄色正能量网站| 国产精品嫩草影院com| 久久中文免费视频| 欧美日韩美女视频| 97成人在线观看| 日韩精品在线视频观看| 黄色大片在线播放| 26uuu另类亚洲欧美日本老年| 国产精品高潮久久| 国产精品日韩欧美一区二区| 国产一区二区三区日韩精品 | 欧美在线综合| 在线免费黄色小视频| 国产色婷婷亚洲99精品小说| 91精品国产高清一区二区三蜜臀| 韩曰欧美视频免费观看| 国产女无套免费视频| 亚洲男人天堂网站| jizz性欧美| 国产精品黄页免费高清在线观看| 91精品久久久久久综合五月天| 亚洲成人第一| 国产精品亚洲产品| 少妇丰满尤物大尺度写真| 国产欧美日韩另类一区| 中日韩精品视频在线观看| 制服丝袜在线91| 国产中文在线| 亚洲 日韩 国产第一| 国产精品1区| 午夜精品福利一区二区| 日韩网站在线| 无码人妻丰满熟妇区毛片蜜桃精品| 国产欧美一区二区在线观看| a v视频在线观看| 欧美成人福利视频| 日本不卡不卡| 国产精品成人v| 日韩欧美天堂| www.av片| 国产成人在线视频网站| 亚洲精品一区二区三区在线播放| 色噜噜久久综合| 天堂网在线观看视频| 欧美激情视频给我| 日韩欧美中文字幕一区二区三区| 亚洲精品中文综合第一页| 久久亚洲视频| 成人在线一级片| 欧美日韩一区二区三区| 无码国产精品一区二区色情男同 | 国产成人av自拍| 日韩va亚洲va欧美va清高| 欧美精品aⅴ在线视频| 91看片在线观看| 国产精品久久久91| 国产99久久精品一区二区300| 欧美老熟妇喷水| 91色婷婷久久久久合中文| 免费看日韩毛片| 日韩av影视在线| 自拍偷拍欧美视频| 蜜桃av噜噜一区二区三| 午夜在线a亚洲v天堂网2018| 一区二区免费在线观看视频| 午夜私人影院久久久久| 深夜福利视频网站| 欧日韩在线观看| 精品久久成人| 亚洲18在线看污www麻豆| 国产精品免费观看视频| 国产又粗又长视频| 久久视频这里只有精品| 欧洲一区在线| 日本五级黄色片| 99国产精品久久| 高清乱码免费看污| 少妇久久久久久| 精品国产一区二| 免费在线黄网站| 99re这里只有精品6| 中文字幕手机在线视频| 视频直播国产精品| 91欧美日韩在线| 春日野结衣av| 国产欧美一区二区精品性色超碰| 无码人妻精品一区二区三区蜜桃91| 在线观看成人黄色| 福利一区三区| 日韩日韩日韩日韩日韩| 国产清纯白嫩初高生在线观看91| 国产乱码久久久久| 91国在线精品国内播放| 不卡在线一区二区| 日韩av影视大全| 精品人伦一区二区三区蜜桃网站| 国产在线资源| 亚洲最大的av网站| 亚洲永久视频| 亚洲伦理一区二区三区| 亚洲精品国产suv| 久久69成人| 国产传媒久久久| 欧美经典一区二区| 亚洲av综合色区无码一二三区| 亲爱的老师9免费观看全集电视剧| 99久久99热这里只有精品| 性活交片大全免费看| 欧美主播一区二区三区| 九色91在线| 午夜精品短视频| 99久久伊人网影院| 91theporn国产在线观看| 91精品国产色综合| 希岛爱理一区二区三区| 国产精品无码久久久久一区二区| 91精品国产色综合久久ai换脸| 中文字幕乱码在线播放| 在线视频一二三区| 中文字幕av一区二区三区| 黄色aaa大片|