星期五基准功能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

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

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

相关文章

SEO优化实践操作

合理的title、description、keywords&#xff1a;搜索对着三项的权重逐个减小&#xff0c;title值强调重点即可&#xff0c;重要关键词出现不要超过2次&#xff0c;而且要靠前&#xff0c;不同页面title要有所不同&#xff1b;description把页面内容高度概括&#xff0c;长度合…

Flot画实时曲线

源代码&#xff1a; <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>深海的小鱼编制-PLOT</title> <script language"javascript" type"text/javascript" src"…

RHQ指标的WildFly子系统

对于RHQ-Metrics&#xff0c;我已经开始为WildFly 8编写一个子系统&#xff0c;该子系统能够在WildFly内收集指标&#xff0c;然后以固定的时间间隔&#xff08;当前为每分钟&#xff09;将其发送到RHQ-Metrics服务器。 下一张图是该发件人连续运行1.5天时结果的可视化效果的G…

Linux下实现客户端和服务器端的通信

首先&#xff0c;可以将代码复制下来放到U盘里&#xff0c;然后挂载到Linux上 挂载步骤 找到设备->USB->你U盘的名字 挂载成功 访问U盘把代码拷贝到home文件夹下&#xff0c;就可以直接进行编译。 client.c #include <stdio.h> #include <unistd.h>#include…

gvim 安装 taglist

gvim 安装 taglist windows XP下&#xff0c;gvim,安装taglisttaglist 是在vim 下可以像 vc当中的可以列出类&#xff0c;函数 的插件。一&#xff0c;下载ctags,将其中的 ctags.exe 复制到gvim.exe 所在的目录&#xff0c;我的是 C:\Program Files\Vim\vim73如果不复制的话&am…

js笔记(八)ES6

大标题补充描述一、 ES6 中新增的声明方式&#xff1a;let、constvar、let、const之间的区别二、 ES6 字符串扩展1. 子串的识别&#xff1a;includes()、startsWith()、endsWith()&#xff1b;2. 重复字符串&#xff1a;repeat()&#xff1b;3. 字符串补全&#xff1a;padStart…

卡夫卡编年史队列基准

总览 最近&#xff0c;我被要求比较《卡夫卡》和《编年史》的性能。 没有两个产品是完全一样的&#xff0c;要进行公平的比较并不容易。 我们可以尝试运行类似的测试&#xff0c;看看会得到什么结果。 该测试基于Apache Kafka性能结果 。 测试使用了什么&#xff1f; 卡夫卡测…

webpack css打包为一个css

1、安装 npm install extract-text-webpack-plugin --save-dev 2、项目目录&#xff1a; index文件夹下的index.css&#xff1a; body{background-color: #ccc;}.flex-div{display: flex;} index文件夹下的index2.css&#xff1a; p{text-indent: 2em;} index文件夹下的index-l…

javascript深入理解js闭包

闭包&#xff08;closure&#xff09;是Javascript语言的一个难点&#xff0c;也是它的特色&#xff0c;很多高级应用都要依靠闭包实现。 一、变量的作用域 要理解闭包&#xff0c;首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种&#xff1a;全局变量和局…

Codeforces Round #568 (Div. 2) G2. Playlist for Polycarp (hard version)

因为不会打公式&#xff0c;随意就先将就一下&#xff1f; #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> using namespace std; typedef long long LL; const int N55; const int MOD1e97; int…

新的开始 和一些总结

接触编程不久&#xff0c;2年而已&#xff0c;也不精通&#xff0c;看得比较泛。java&#xff0c;C&#xff0c;C#都有所涉猎&#xff0c;但是仅仅停留于可以编码的阶段&#xff0c;让我就某个问题给出专业的解释&#xff0c;是断无可能的。现在准备考研了&#xff0c;很长一段…

jQuery实现页面关键词高亮

示例代码&#xff0c;关键位置做了注释&#xff0c;请查看代码&#xff1a; <html><head><title>jQuery实现页面关键词高亮</title><style type"text/css">* {margin: 0;padding: 0;}p {padding: 10px;margin-bottom: 20px;}.highligh…

简而言之,JUnit:测试隔离

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

Apache Camel 2.14中的更多指标

Apache Camel 2.14将于本月晚些时候发布。 由于正在解决某些Apache基础结构问题&#xff0c;因此存在一些问题。 这篇博客文章讨论的是我们添加到此版本中的新功能之一。 感谢Lauri Kimmel捐赠了骆驼指标组件&#xff0c;我们将其与出色的Codehale指标库集成在一起。 因此&am…

ASP.NET进阶(8):HttpModule和HttpApplication

前面三节讲了控件的构造、呈现和数据绑定&#xff0c;我想该差不多了。本想讲一个自定义控件来终结控件部分&#xff0c;但是我个人不太喜欢控件这些东西&#xff0c;所以也就懒的写相关的内容&#xff0c;抱歉了。虽然我不喜欢使用控件&#xff0c;但我还是喜欢整个WebForm的设…

移动端网页宽度值(未加meta viewport标签)

移动端网页宽度值&#xff08;未加meta viewport标签&#xff09;: iphone:980px Galaxy&#xff08;盖乐世&#xff09;&#xff1a;980px Nexus&#xff1a;980px blackberry&#xff08;黑莓&#xff09;&#xff1a;980px LG&#xff1a;980px Nokia&#xff1a;980p…

简而言之:JRunner

关于JUnit测试要点的多篇教程的第四章介绍了该工具可交换测试运行器体系结构的目的&#xff0c;并介绍了一些可用的实现。 正在进行的示例通过编写参数化测试的不同可能性扩大了主题。 由于我已经发布了JUnit Rules的介绍&#xff0c;因此我决定跳过关于该主题的已宣布部分。 …

cmake how to create vs file filters

cmake how to create vs file filters 用cmakelists构建出来的工程&#xff0c;没有文件filters&#xff0c;可采用如下方法解决 set(SOURCE_LIST"lotteryTicket.cpp""stdafx.cpp""stdafx.h""test/main.cpp" )add_executable(lotteryT…

Cannot retrieve mapping for action

想必用过Struts的朋友都遇到过这个异常吧&#xff01;没遇到的也可能&#xff0c;只能说你很强或运气不错。 我遇到该异常的解释是我不强&#xff0c;用Struts不是很多&#xff0c;或者说根本不熟练&#xff0c;对一些知识了解得并不深&#xff0c;仅仅皮毛而已&#xff0c;所以…

休眠字节码增强

介绍 既然您了解了Hibernate脏检查的基础知识 &#xff0c;我们就可以研究增强的脏检查机制。 虽然默认的图遍历算法对于大多数用例可能已足够&#xff0c;但有时您需要优化的脏检查算法&#xff0c;并且检测方法比构建自己的自定义策略更方便。 使用Ant休眠工具 传统上&#…