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();}
}

在深入探讨性能之前,请注意以下两点:

  1. 忘记init()方法,那只是初始化jvm中的对象,否则数字简直是疯了。
  2. 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相关推荐

  1. 星期五基准功能Java

    让我们的产品负责人想象一下有一天会发疯,并要求您执行以下操作: From a set of Strings as follows : " marco_8"," john_ ...

  2. java基准测试_微基准测试进入Java 9

    java基准测试 我已经几个月没有在这里写文章了,这种例外还会继续. 我计划在明年三月左右恢复写作. 本文末尾的说明. 等待! 不完全是最后,因为您可以向下滚动. 它在文章结尾处. 继续阅读! 三年前 ...

  3. java内核_测量时间:从Java到内核再到

    java内核 问题陈述 当您深入研究时,即使是最基本的问题也会变得很有趣. 今天,我想深入研究一下Java时间. 我们将从Java API的最基础知识开始,然后逐步降低堆栈:通过OpenJDK源代码g ...

  4. 如何创建第一个java程序_创建第一个java程序

    开发环境:ubuntu 10.04 + eclipse 方法一:打开eclipse编译器,选择 File->New->Java project,输入工程名称,点击finish,在工程目录中 ...

  5. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...

  6. java相册_精致小巧的java相册制作方法

    本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下 注: 1)html上的图片是静态指定的.当更新了新的图片时必须手工更新.所以使用Servlet读取本地images中的所有图片,动态 ...

  7. acm教程 java版_[转]ACM之java速成

    这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Sc ...

  8. 猜物品游戏java编程_小猿圈Java初学者练习小案例:猜数字游戏

    对于Java初学者,如果没有好的引导,可能会觉得自己学什么都不好,学什么都不会,这个时候就要给他们一下小的案例,让他们去实践一下,让他们知道自己学的东西是可以用到的,小猿圈java讲师为你准备了Jav ...

  9. java项目_好程序员Java分享从入门到服务端项目开发的过程

    好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...

最新文章

  1. AI独角兽第四范式冲刺港交所IPO!集齐国有五大行入股,刚获宁德时代制造大单...
  2. matplotlib安装
  3. javascript访问ACCESS数据库
  4. java并发之CAS
  5. C#非泛型集合类-使用HashTable组织数据
  6. mtk一键usb驱动_微星b460主板装win7系统及bios设置教程(支持十代usb驱动)
  7. UVa1586 - Molar mass
  8. 苏宁:我们开发百度小程序遇到的那些“坑”
  9. 6. Zend Studio
  10. Excel: 如何对Excel2007工作表做统一编辑修改
  11. ESXi社区版NVMe驱动更新v1.1
  12. julia安装源_Ubuntu下安装Julia
  13. 2022计算机类投稿心得(须知)
  14. .scc文件是做什么用的?
  15. C++——直角三角形面积
  16. Java 本地接口(JNI)编程指南和规范学习笔记2
  17. 搭建个人的第一个服务器以及域名申请和绑定--阿里云服务器
  18. 主动提交sitemap让谷歌、雅虎、MSN统统收录你的网站、博客
  19. ESP-AT 实践:如何使用两个 ESP32 设备,通过 AT 指令进行 BT SPP 通信?
  20. BigTable论文分析

热门文章

  1. [XSY] 选举(线段树优化dp)
  2. SpringCloud Greenwich(五)之nacos、dubbo、Zuul和 gateway集成
  3. SpringBoot2.1.9 分布式锁ShedLock不执行坑
  4. 我终于搞清楚了和String有关的那点事儿
  5. java异常捕获的一点感悟
  6. 零基础写Java知乎爬虫之进阶篇
  7. 关于Java序列化你应该知道的一切
  8. Wamp升级php到7.3版本
  9. 【C单链表】链表与尾插法
  10. javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-Service.xml