java基准测试_星期五基准功能Java
java基准测试
让我们的产品所有者有一天变得疯狂,并要求您执行以下操作:
From a set of Strings as follows :
“ marco_8”,“ john_33”,“ marco_1”,“ john_33”,“ thomas_5”,“ john_33”,“ marco_4”,...。
给我一个逗号分隔的字符串,其中只包含marco的数字,并且数字需要按顺序排列。
预期结果的示例:“ 1,4,8”
我将以4种不同的方式实现此逻辑,并且将对其中的每一种进行微基准测试。 我要实现逻辑的方法是:
- 传统的Java与循环和所有。
- 可与番石榴一起使用
- 可与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();}
}
在深入探讨性能之前,请注意以下两点:
- 忘记init()方法,那只是初始化jvm中的对象,否则数字简直是疯了。
- Java 8的功能风格看起来比番石榴更好,也比以传统方式开发的更干净!
性能:
在具有4核的mac上运行该程序,结果如下:
========================
Classic : 151941400
Guava : 238798150
Stream : 151853850
Parallel Stream : 55724700
========================
并行流快3倍 。 这是因为Java会将作业拆分为多个任务(任务的总和取决于您的计算机,内核等)并将并行运行它们,最后汇总结果。
经典Java和Java 8流具有大致相同的性能。
番石榴更宽松。
这太了不起了,所以有人会想: “太酷了,我可以一直使用parallelStream,到年底我将获得丰厚的回报”。
但是生活绝非易事。 当您将该字符串集从200.000减少到20时,会发生以下情况:
========================
Classic : 36950
Guava : 69650
Stream : 29850
Parallel Stream : 143350
========================
并行流变得非常慢。 这是因为parallelStream在初始化和管理多任务以及组合结果方面有很大的开销。
现在,Java 8流看上去是赢家,而其他2种则胜出。
好的,在这一点上,有人可以说: “对于具有很多元素的集合,我使用parallelStream,否则我使用stream。”
那将很容易获得,但是当我再次将Set从20减少到2时会发生什么呢?
这个 :
========================
Classic : 8500
Guava : 20050
Stream : 24700
Parallel Stream : 67850
========================
经典的Java循环使用很少的元素会更快。
因此,在这一点上,我可以回到疯狂的产品所有者那里,询问他认为该输入集合中有多少个String。 20吗 减? 更多? 多得多?
就像木匠说的: 两次测量,一次切割!
翻译自: https://www.javacodegeeks.com/2014/09/friday-benchmarking-functional-java.html
java基准测试
java基准测试_星期五基准功能Java相关推荐
- 星期五基准功能Java
让我们的产品负责人想象一下有一天会发疯,并要求您执行以下操作: From a set of Strings as follows : " marco_8"," john_ ...
- java基准测试_微基准测试进入Java 9
java基准测试 我已经几个月没有在这里写文章了,这种例外还会继续. 我计划在明年三月左右恢复写作. 本文末尾的说明. 等待! 不完全是最后,因为您可以向下滚动. 它在文章结尾处. 继续阅读! 三年前 ...
- java内核_测量时间:从Java到内核再到
java内核 问题陈述 当您深入研究时,即使是最基本的问题也会变得很有趣. 今天,我想深入研究一下Java时间. 我们将从Java API的最基础知识开始,然后逐步降低堆栈:通过OpenJDK源代码g ...
- 如何创建第一个java程序_创建第一个java程序
开发环境:ubuntu 10.04 + eclipse 方法一:打开eclipse编译器,选择 File->New->Java project,输入工程名称,点击finish,在工程目录中 ...
- 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...
- java相册_精致小巧的java相册制作方法
本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下 注: 1)html上的图片是静态指定的.当更新了新的图片时必须手工更新.所以使用Servlet读取本地images中的所有图片,动态 ...
- acm教程 java版_[转]ACM之java速成
这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Sc ...
- 猜物品游戏java编程_小猿圈Java初学者练习小案例:猜数字游戏
对于Java初学者,如果没有好的引导,可能会觉得自己学什么都不好,学什么都不会,这个时候就要给他们一下小的案例,让他们去实践一下,让他们知道自己学的东西是可以用到的,小猿圈java讲师为你准备了Jav ...
- java项目_好程序员Java分享从入门到服务端项目开发的过程
好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...
最新文章
- AI独角兽第四范式冲刺港交所IPO!集齐国有五大行入股,刚获宁德时代制造大单...
- matplotlib安装
- javascript访问ACCESS数据库
- java并发之CAS
- C#非泛型集合类-使用HashTable组织数据
- mtk一键usb驱动_微星b460主板装win7系统及bios设置教程(支持十代usb驱动)
- UVa1586 - Molar mass
- 苏宁:我们开发百度小程序遇到的那些“坑”
- 6. Zend Studio
- Excel: 如何对Excel2007工作表做统一编辑修改
- ESXi社区版NVMe驱动更新v1.1
- julia安装源_Ubuntu下安装Julia
- 2022计算机类投稿心得(须知)
- .scc文件是做什么用的?
- C++——直角三角形面积
- Java 本地接口(JNI)编程指南和规范学习笔记2
- 搭建个人的第一个服务器以及域名申请和绑定--阿里云服务器
- 主动提交sitemap让谷歌、雅虎、MSN统统收录你的网站、博客
- ESP-AT 实践:如何使用两个 ESP32 设备,通过 AT 指令进行 BT SPP 通信?
- BigTable论文分析
热门文章
- [XSY] 选举(线段树优化dp)
- SpringCloud Greenwich(五)之nacos、dubbo、Zuul和 gateway集成
- SpringBoot2.1.9 分布式锁ShedLock不执行坑
- 我终于搞清楚了和String有关的那点事儿
- java异常捕获的一点感悟
- 零基础写Java知乎爬虫之进阶篇
- 关于Java序列化你应该知道的一切
- Wamp升级php到7.3版本
- 【C单链表】链表与尾插法
- javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-Service.xml