日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

实现Java集合迭代的高性能

發布時間:2024/4/14 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现Java集合迭代的高性能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/81042018

實現Java集合迭代的高性能

  • 2018.7.14
  • 版權聲明:本文為博主chszs的原創文章,未經博主允許不得轉載。

一、介紹

Java開發者經常會遇到處理集合(比如ArrayList、HashSet)的情況,Java 8也提供了Lambda表達式和Streaming API來簡化集合相關的工作。在大多數應用場景下,無需考慮集合迭代的性能消耗。但是,在一些極端情況下,比如集合包含了上百萬條記錄的情況,這個時候集合迭代就需要選擇正確的姿勢,否則性能會較差。

使用JMH檢查下面每段代碼片段的運行時間。

二、forEach vs. C Style vs. Stream API

迭代是一個非常基本的功能,所有的編程語言都有簡單的迭代語法,允許程序員在集合上運行迭代。Stream API可以通過Collections用非常直接的方式進行迭代。

public List<Integer> streamSingleThread(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());state.testData.stream().forEach(item -> {result.add(item);});return result; }public List<Integer> streamMultiThread(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());state.testData.stream().parallel().forEach(item -> {result.add(item);});return result; }

使用forEach循環也非常簡單:

public List<Integer> forEach(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());for(Integer item : state.testData) {result.add(item);}return result; }

C style方式的迭代其代碼要冗長一些,但仍然非常緊湊:

public List<Integer> forCStyle(BenchMarkState state) {int size = state.testData.size();List<Integer> result = new ArrayList<>(size);for(int j = 0; j < size; j ++){result.add(state.testData.get(j));}return result; }

以上代碼的性能評分如下:

BenchmarkModeCntScoreErrorUnits
TestLoopPerformance.forCStyleavgt20018.068± 0.074ms/op
TestLoopPerformance.forEachavgt20030.566± 0.165ms/op
TestLoopPerformance.streamMultiThreadavgt20079.433± 0.747ms/op
TestLoopPerformance.streamSingleThreadavgt20037.779± 0.485ms/op

對于C style方式的迭代,JVM只是簡單地增加了一個整型變量,它直接從內存讀值。這使它非常快。但forEach迭代則不同,根據Oracle官方文檔,JVM必須把forEach轉換為迭代器并為每個數據項調用hasNext()。這就是為什么forEach比C style

總結

以上是生活随笔為你收集整理的实现Java集合迭代的高性能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。