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

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

  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基准测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python2048游戏代码_【Python】用Python实现2048小游戏(源代码,1.0版本)

#2048 用python实现import randomimport mathimport osglobal scorescore 0def start():#开始a [[0 for i in range(4)] for i in range(4)] #构造一个4*4的列表i random.randint(0,3)j random.randint(0,3)p2 random.random()if p2>0.9: a[i][j] 4 #有0.9几率出现2el…

性能php 教程,提高PHP性能效率的几个技巧

如何提高效率问题&#xff0c;往往同样的功能&#xff0c;不一样的代码&#xff0c;出来的效率往往大不一样。● 用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则不会&#xff0c;注意&#xff1a;…

oop 类和对象的_实用程序类的OOP替代

oop 类和对象的实用程序类&#xff08;也称为帮助程序类&#xff09;是仅具有静态方法且不封装状态的“结构”。 StringUtils &#xff0c; IOUtils &#xff0c; FileUtils从Apache的共享 ; Guava的 Iterables和Iterators以及JDK7的Files是实用程序类的完美示例。 这种设计思…

python读取json数据格式问题_浅谈Python中的异常和JSON读写数据的实现

异常可以防止出现一些不友好的信息返回给用户&#xff0c;有助于提升程序的可用性&#xff0c;在java中通过try ... catch ... finally来处理异常&#xff0c;在Python中通过try ... except ... else来处理异常一、以ZeroDivisionError为例&#xff0c;处理分母为0的除法异常de…

python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区

参考&#xff1a;############################################################函数zeros()在模块numpy中&#xff1a;from numpy import *help(zeros)该函数功能是创建给定类型的矩阵&#xff0c;并初始化为0参数简洁&#xff1a;shape&#xff1a;可以是int类型数据&#x…

OCA第5部分中的Java难题

在Java Puzzlers系列的第五部分中&#xff0c;我们将看到与X.parseX&#xff08;String s&#xff09;方法相关的内容。 您可以看到我们对X.parseX&#xff08;&#xff09;方法的期望。 public class Puzzler { public static void main(String[] args){ int i Integer.pars…

sqlmap绕过d盾_Waf功能、分类与绕过

## 一. waf工作原理Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。常见的系统攻击分为两类&#xff1a;- 一是利用Web服务器的漏洞进行攻击&#xff0c;如DDOS攻击、病毒木马破坏等攻击&#xff1b;- 二是利用网页自身的安全漏洞进…

maven的常见问题_Maven常见问题和陷阱

maven的常见问题喜欢它还是讨厌它&#xff08;很多人似乎都讨厌它&#xff09;&#xff0c; Maven是64&#xff05;的Java开发人员广泛使用的工具&#xff08;来源– 2014年Java工具和技术前景 &#xff09;。 大多数经验丰富的开发人员已经对Maven感到头疼。 通常以困难的方式…

matlab graphic,Matlab图形系统,Matlab Graphic System,音标,读音,翻译,英文例句,英语词典...

Image:114994698204558.jpgmatlabmatlab是矩阵实验室(matrix laboratory)之意。除具备卓越的数值计算能力外&#xff0c;它还提供了专业水平的符号计算&#xff0c;文字处理&#xff0c;可视化建模仿真和实时控制等功能。matlab的基本数据单位是矩阵&#xff0c;它的指令表达式…

python调用opengl_Python运行OpenGL示例

说明python的opengl库叫PyOpenGL&#xff0c;安装这个库的时候要注意位数版本要正确&#xff0c;比如我的python37是32位的&#xff0c;安装PyOpenGL-3.1.5-cp37-cp37m-win32.whl才行&#xff0c;默认pip安装的运行时可能会有问题&#xff0c;所以需要手动下载安装对应版本的wh…

php内置的数组函数大全,php数组的内置函数大全

1.array_change_key_case($arr,CASE_UPPER/CASE_LOWER)将$arr的键值转换为大写或者小写2.array_combine($arr1, $arr2) $arr1的值作为键,$arr2作为值生成后返回新的数组3.array_key_exists(‘key’, $arr)$arr中是否存在key&#xff0c;如果存在返回true&#xff0c;如果不存在…

用vs写python和c++需要哪些工具包_从运行效率与开发效率比较Python和C++

之前有人一直在说python怎么怎么好用&#xff0c;也有人说C太难了&#xff0c;下面我做了一些笔记&#xff1a;1、运行效率&#xff1a;C >> PythonPython代码和C最终都会变成CPU指令来跑&#xff0c;但一般情况下&#xff0c;比如反转和合并两个字符串&#xff0c;Pytho…

JUnit5 TestSuite替代

JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常&#xff0c;通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是&#xff0c;如果目标不是测试发现&#xff0c;而是不同测试类之间的资源共享&#xff0c;那么创建父对象是有意义的。 JUnit 5提供了N…

oracle 日志丢失,Oracle联机日志文件丢失解决方法一例

由于丢失的当前的联机日志文件&#xff0c;所以可能会丢失部分数据&#xff0c;破坏数据库的完整性&#xff0c;而且普通的重建日志文件的方式是不可行的&#xff0c;这个时候我们需要借助隐含参数_ALLOW_READ_ONLY_CORRUPTION或者_ALLOW_RESETLOGS_CORRUPTION打开数据库。打开…

junit:junit_简而言之,JUnit:测试隔离

junit:junit作为顾问&#xff0c;我仍然经常遇到程序员&#xff0c;他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法&#xff0c;以从我的角度解释要点。 尽管存在一些有关使用该工具进行测试的好书和文章&#xff0c;但是也许可以通过本动手实践系列中的…

python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法

1 #这里列举在os模块中关于文件/目录常用的函数使用方法23 #这里需要注意下&#xff0c;在使用这些方法前记得导入os模块4 import os #导入os模块5 """6 os对象方法&#xff1a;7 os.getcwd() #返回当前工作目录8 os.chdir(path) #改变工作目录9 os.listdir(pat…

OCA第2部分中的Java难题

欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中&#xff0c;我们将看到一个有趣的案例&#xff0c;涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中&#xff0c;您可以在十进制文字中看到分隔符下划线。 还请注意&#xff0c;该类现在可以正常编译。 八进制是…

msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...

点击上面蓝色字体关注&#xff01;装修图例 | 别墅装修 | 装潢装饰 | 样板楼梯 | 装修设计很多复式或者别墅的房子&#xff0c;楼梯是不可缺少的建筑&#xff0c;大部分楼梯是连接客厅以及卧室的&#xff0c;很多朋友都选择在楼梯上面铺地板&#xff0c;木地板的改装空间大&…

php程序xml有必要学习吗,对初学者非常有用的PHP技巧

对初学者非常有用的PHP技巧echo "I is : $i ;}echo print_footer();那么&#xff0c;为什么你应该做输出缓冲呢&#xff1a;你可以在将输出发送给浏览器之前更改它&#xff0c;如果你需要的话。例如做一些str_replaces&#xff0c;或者preg_replaces&#xff0c;又或者是在…

OCA第1部分中的Java难题

我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书&#xff0c;我对所学到的一些新知识感到惊讶。 有时候他们真的没有任何意义&#xff0c;有时候他们虽然有道理&#xff0c;但确实令人惊讶。 因此&#xff0c;在本系列文章中&#xff0c;我想将它们共享为“ Ja…