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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java基准测试_星期五基准功能Java

發(fā)布時(shí)間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java基准测试_星期五基准功能Java 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java基準(zhǔn)測(cè)試

讓我們的產(chǎn)品所有者有一天變得瘋狂,并要求您執(zhí)行以下操作:

From a set of Strings as follows :

“ marco_8”,“ john_33”,“ marco_1”,“ john_33”,“ thomas_5”,“ john_33”,“ marco_4”,...。

給我一個(gè)逗號(hào)分隔的字符串,其中只包含marco的數(shù)字,并且數(shù)字需要按順序排列。

預(yù)期結(jié)果的示例:“ 1,4,8”



我將以4種不同的方式實(shí)現(xiàn)此邏輯,并且將對(duì)其中的每一種進(jìn)行微基準(zhǔn)測(cè)試。 我要實(shí)現(xiàn)邏輯的方法是:

  • 傳統(tǒng)的Java與循環(huán)和所有。
  • 可與番石榴一起使用
  • 可與Java 8流一起使用
  • 與Java 8 parallelStream一起使用

代碼在下面或

package com.marco.brownbag.functional; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; import com.google.common.collect.Ordering; public class MicroBenchMarkFunctional {private static final int totStrings = 2;public static void main(String[] args) {Set<String> someNames = new HashSet<String>();init(someNames);for (int i = 1; i < totStrings; i++) {someNames.add("marco_" + i);someNames.add("someone_else_" + i);}System.out.println("start");run(someNames);}private static void run(Set<String> someNames) {System.out.println("========================");long start = System.nanoTime();int totalLoops = 20;for (int i = 1; i < totalLoops; i++) {classic(someNames);}System.out.println("Classic ? ? ? ? : " + ((System.nanoTime() - start)) / totalLoops);start = System.nanoTime();for (int i = 1; i < totalLoops; i++) {guava(someNames);}System.out.println("Guava ? ? ? ? ? : " + ((System.nanoTime() - start)) / totalLoops);start = System.nanoTime();for (int i = 1; i < totalLoops; i++) {stream(someNames);}System.out.println("Stream ? ? ? ? ?: " + ((System.nanoTime() - start)) / totalLoops);start = System.nanoTime();for (int i = 1; i < totalLoops; i++) {parallelStream(someNames);}System.out.println("Parallel Stream : " + ((System.nanoTime() - start)) / totalLoops);System.out.println("========================");}private static void init(Set<String> someNames) {someNames.add("marco_1");classic(someNames);guava(someNames);stream(someNames);parallelStream(someNames);someNames.clear();}private static String stream(Set<String> someNames) {return someNames.stream().filter(element -> element.startsWith("m")).map(element -> element.replaceAll("marco_", "")).sorted().collect(Collectors.joining(","));}private static String parallelStream(Set<String> someNames) {return someNames.parallelStream().filter(element -> element.startsWith("m")).map(element -> element.replaceAll("marco_", "")).sorted().collect(Collectors.joining(","));}private static String guava(Set<String> someNames) {return Joiner.on(',').join(Ordering.from(String.CASE_INSENSITIVE_ORDER).immutableSortedCopy(Collections2.transform(Collections2.filter(someNames, Predicates.containsPattern("marco")), REPLACE_MARCO)));}private static Function<String, String> REPLACE_MARCO = new Function<String, String>() {@Overridepublic String apply(final String element) {return element.replaceAll("marco_", "");}};private static String classic(Set<String> someNames) {List<String> namesWithM = new ArrayList<String>();for (String element : someNames) {if (element.startsWith("m")) {namesWithM.add(element.replaceAll("marco_", ""));}}Collections.sort(namesWithM);StringBuilder commaSeparetedString = new StringBuilder();Iterator<String> namesWithMIterator = namesWithM.iterator();while (namesWithMIterator.hasNext()) {commaSeparetedString.append(namesWithMIterator.next());if (namesWithMIterator.hasNext()) {commaSeparetedString.append(",");}}return commaSeparetedString.toString();} }

在深入探討性能之前,請(qǐng)注意以下兩點(diǎn):

  • 忘記init()方法,那只是初始化jvm中的對(duì)象,否則數(shù)字簡(jiǎn)直是瘋了。
  • Java 8的功能風(fēng)格看起來(lái)比番石榴更好,也比以傳統(tǒng)方式開(kāi)發(fā)的更干凈!
  • 性能:

    在具有4核的mac上運(yùn)行該程序,結(jié)果如下:

    ======================== Classic??????? ?: 151941400 Guava???????????: 238798150 Stream???????? ?: 151853850 Parallel Stream : 55724700 ========================

    并行流快3倍 。 這是因?yàn)镴ava會(huì)將作業(yè)拆分為多個(gè)任務(wù)(任務(wù)的總和取決于您的計(jì)算機(jī),內(nèi)核等)并將并行運(yùn)行它們,最后匯總結(jié)果。

    經(jīng)典Java和Java 8流具有大致相同的性能。

    番石榴更寬松。

    這太了不起了,所以有人會(huì)想: “太酷了,我可以一直使用parallelStream,到年底我將獲得豐厚的回報(bào)”。

    但是生活絕非易事。 當(dāng)您將該字符串集從200.000減少到20時(shí),會(huì)發(fā)生以下情況:

    ======================== Classic?????????: 36950 Guava???????????: 69650 Stream???????? ?: 29850 Parallel Stream : 143350 ========================

    并行流變得非常慢。 這是因?yàn)閜arallelStream在初始化和管理多任務(wù)以及組合結(jié)果方面有很大的開(kāi)銷。

    現(xiàn)在,Java 8流看上去是贏家,而其他2種則勝出。

    好的,在這一點(diǎn)上,有人可以說(shuō): “對(duì)于具有很多元素的集合,我使用parallelStream,否則我使用stream。”

    那將很容易獲得,但是當(dāng)我再次將Set從20減少到2時(shí)會(huì)發(fā)生什么呢?
    這個(gè) :

    ======================== Classic??????? ?: 8500 Guava????????? ?: 20050 Stream???????? ?: 24700 Parallel Stream : 67850 ========================

    經(jīng)典的Java循環(huán)使用很少的元素會(huì)更快。

    因此,在這一點(diǎn)上,我可以回到瘋狂的產(chǎn)品所有者那里,詢問(wèn)他認(rèn)為該輸入集合中有多少個(gè)String。 20嗎 減? 更多? 多得多?

    就像木匠說(shuō)的: 兩次測(cè)量,一次切割!

    翻譯自: https://www.javacodegeeks.com/2014/09/friday-benchmarking-functional-java.html

    java基準(zhǔn)測(cè)試

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的java基准测试_星期五基准功能Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。