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

歡迎訪問 生活随笔!

生活随笔

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

java

java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍

發布時間:2023/12/3 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java lambda::

與長期的實現相比,Java 8 lambda和流的性能如何?

Lambda表達式和流在Java 8中受到了熱烈的歡迎。這些是迄今為止很激動人心的功能,很長一段時間以來,它們就已經應用到Java中了。 新的語言功能使我們可以在代碼中采用更具功能性的樣式,并且在其中玩耍很有趣。 太有趣了,應該是非法的。 然后我們變得可疑 ,并決定對它們進行測試。

我們已經完成了一個簡單的任務,即在ArrayList中找到最大值,并測試了長期的實現與Java 8中可用的新方法的對比。老實說,結果令人驚訝。

Java 8中的命令式與功能式編程

我們喜歡直截了當,所以讓我們看一下結果。 對于此基準,我們創建了一個ArrayList,為其中填充了100,000個隨機整數,并實現了7種不同的方式來遍歷所有值以找到最大值。 這些實現分為兩類:具有Java 8中引入的新語言功能的功能樣式和具有長期Java方法的命令式樣式。

這是每種方法花費的時間:

**記錄的最大錯誤是parallelStream上的0.042,完整的結果輸出可在該文章的底部找到

外賣

  • 哎呀! 使用Java 8提供的任何新方法來實現解決方案,都會使性能下降5倍左右。 有時,使用帶有迭代器的簡單循環比將lambda和流混入混合要好。 即使這意味著編寫更多的代碼行并跳過那種甜蜜的語法糖。
  • 使用迭代器或for-each循環是遍歷ArrayList的最有效方法。 比具有索引int的傳統for循環好兩倍。
  • 在Java 8方法中,使用并行流被證明更有效。 但是當心, 在某些情況下,它實際上可能會使您減速。
  • Lambas取代了它們在流和parallelStream實現之間的位置。 令人驚訝的是,它們的實現基于流API。
  • [編輯]事情并非總是如此:盡管我們想展示在lambda和流中引入錯誤有多么容易,但我們收到了很多社區反饋,要求對基準代碼添加更多優化并刪除對它們的裝箱/拆箱。整數。 包括優化在內的第二組結果可在本文的底部獲得。
  • 等一下,我們到底在這里測試了什么?

    讓我們快速瀏覽一下每種方法,從最快到最慢:

    命令式

    forMaxInteger() –使用簡單的for循環和int索引遍歷列表:

    public int forMaxInteger() {int max = Integer.MIN_VALUE;for (int i = 0; i < size; i++) {max = Integer.max(max, integers.get(i));}return max; }

    iteratorMaxInteger() –使用迭代器遍歷列表:

    public int iteratorMaxInteger() {int max = Integer.MIN_VALUE;for (Iterator<Integer> it = integers.iterator(); it.hasNext(); ) {max = Integer.max(max, it.next());}return max; }

    forEachLoopMaxInteger() –丟失迭代器,并使用For-Each循環遍歷列表(不要誤解為Java 8 forEach):

    public int forEachLoopMaxInteger() {int max = Integer.MIN_VALUE;for (Integer n : integers) {max = Integer.max(max, n);}return max; }

    功能風格

    parallelStreamMaxInteger() –在并行模式下使用Java 8流瀏覽列表:

    public int parallelStreamMaxInteger() {Optional<Integer> max = integers.parallelStream().reduce(Integer::max);return max.get(); }

    lambdaMaxInteger() –將lambda表達式與流一起使用。 甜蜜的一線:

    public int lambdaMaxInteger() {return integers.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b)); }

    forEachLambdaMaxInteger() –對于我們的用例,這有點混亂。 新的Java 8 forEach功能可能最令人討厭的是它只能使用最終變量,因此我們為最終包裝器類創建了一些變通方法,該類訪問我們正在更新的最大值:

    public int forEachLambdaMaxInteger() {final Wrapper wrapper = new Wrapper();wrapper.inner = Integer.MIN_VALUE;integers.forEach(i -> helper(i, wrapper));return wrapper.inner.intValue(); }public static class Wrapper {public Integer inner; }private int helper(int i, Wrapper wrapper) {wrapper.inner = Math.max(i, wrapper.inner);return wrapper.inner; }

    順便說一句,如果我們已經在談論forEach,請查看這個StackOverflow答案,我們就其某些缺點提供了一些有趣的見解。

    streamMaxInteger() –使用Java 8流瀏覽列表:

    public int streamMaxInteger() {Optional<Integer> max = integers.stream().reduce(Integer::max);return max.get(); }

    優化基準

    遵循本文的反饋意見,我們創建了基準的另一個版本。 與原始代碼的所有差異都可以在此處查看 。 結果如下:

    TL; DR:更改摘要

  • 該列表不再可變。
  • forMax2的新方法刪除了字段訪問。
  • forEachLambda中的冗余幫助程序功能已修復。 現在,lambda也正在分配一個值。 可讀性較低,但速度更快。
  • 自動裝箱消除了。 如果您在Eclipse中打開項目的自動裝箱警告,則舊代碼中有15條警告。
  • 在reduce之前使用mapToInt修復流代碼。
  • 感謝Patrick Reinhart , Richard Warburton , Yan Bonnel , Sergey Kuksenko , Jeff Maxwell , Henrik Gustafsson以及在Twitter上發表評論的每個人!

    基礎

    為了運行此基準,我們使用了JMH,即Java Microbenchmarking Harness。 如果您想了解更多有關如何在自己的項目中使用它的信息, 請查看這篇文章 ,我們將通過動手示例來了解它的一些主要功能。

    基準配置包括2個JVM分支,5個預熱迭代和5個測量迭代。 測試使用Java 8u66和JMH 1.11.2在c3.xlarge Amazon EC2實例(4個vCPU,7.5 Mem(GiB),2 x 40 GB SSD存儲)上運行。 完整的源代碼可在GitHub上找到 ,您可以在此處查看原始結果輸出。

    話雖這么說,但有一點免責聲明:基準往往非常危險,要正確地制定基準則非常困難。 雖然我們嘗試以最準確的方式運行它,但始終建議您花一點時間來獲取結果。

    最后的想法

    使用Java 8時,要做的第一件事是嘗試使用lambda表達式和流。 但是要當心:它感覺真的很好,很甜,所以您可能會上癮! 我們已經看到,堅持使用迭代器和for-each循環的更傳統的Java編程風格,明顯優于Java 8提供的新實現。當然,情況并非總是如此,但是在這個非常常見的示例中,它表明可以大約差5倍。 如果它影響系統的核心部分或創建新的瓶頸,這會變得非常可怕。

    翻譯自: https://www.javacodegeeks.com/2015/11/benchmark-java-8-lambdas-streams-can-make-code-5-times-slower.html

    java lambda::

    總結

    以上是生活随笔為你收集整理的java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍的全部內容,希望文章能夠幫你解決所遇到的問題。

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