java基准测试_星期五基准功能Java
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):
性能:
在具有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è) :
經(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)題。
- 上一篇: 如果你的电脑中毒你会怎么办电脑中毒了该怎
- 下一篇: java美元兑换,(Java实现) 美元