Java:使用SingletonStream获得性能

仅具有一个元素的Java流有时会在应用程序中造成不必要的开销。 了解如何使用SingletonStream对象并为其中某些此类流获得十倍的性能,并了解如何同时简化代码。

背景

Java 8中的Stream库是有史以来Java语言最强大的功能之一。 一旦您开始了解它的多功能性和所产生的代码可读性,您的Java代码样式将永远改变。 与其使用forifswitch语句以及众多中间变量来充斥所有琐碎的细节,您还可以使用Stream ,它仅包含要做什么的描述,而不是实际上是如何完成的。

SingletonStream

几年前,我们不得不为Java项目做出API决定:我们应该为两种快速本地内存数据缓存方法选择哪种返回类型;

  • 唯一的搜索键,返回一个值或不返回任何值
  • 一个非唯一的搜索键,它返回任意数量的值(零到无穷大)。

这是最初的想法:

Optional<T> searchUnique(K key); // For unique keys
Stream<T> search(K key);         // For non-unique keys

但是,我们希望这两个方法看起来完全相同,并且都返回一个
Stream<T> 。 然后,API看起来会更加整洁,因为唯一缓存将看上去与非唯一缓存完全相同。

但是,唯一搜索必须非常高效,并且每秒必须创建数百万个结果对象,而又不会产生太多开销。

解决方案

通过实现仅包含单个元素的SingletonStream (因此,与具有任意数量元素的普通Stream相比,可以进行高度优化),我们能够让这两种方法在保持性能的同时返回Stream 。 如果未找到键,则方法searchUnique(K key)将返回一个空流( Stream.empty() ),如果该键存在,则它将返回SingletonStream以及与该键关联的值。 我们会得到:

Stream<T> searchUnique(K key); // For unique keys
Stream<T> search(K key);       // For non-unique keys

大! 我们可以吃饼干,仍然可以吃!

实施

SingletonStream是Speedment Stream ORM的一部分,可以在GitHub上查看。 随意使用的Speedment自己的项目中使用Speedment任何它的组件的初始化 。

SingletonStream是使用JVM的Escape Analysis进行堆栈分配的不错选择(在我以前的文章中, 这里和此处有关Escape Analysis的更多信息 )。 该实现有两种形式。 如果将STRICT值设置为true ,我们将获得一个完全惰性的Stream ,但是缺点是,一旦调用诸如.filter(), map()中间操作 ,我们将失去Singleton属性 。另一方面,将STRICT值设置为falseSingletonStream会急切地执行许多中间操作 ,并且它将能够返回新的SingletonStream从而保留Singleton属性 。 在许多情况下,这将提供更好的性能。

这里为参考流设计的解决方案也可以很容易地修改为单例流的原始形式。 因此,编写SingletonIntStream
SingletonLongStreamSingletonDoubleStream 。 这是SingletonLongStream 。

应该注意的是,该类可以进一步发展,以便它可以支持惰性评估,同时始终保持高性能。 这是未来的工作。

性能

有多种方法可以测试SingletonStream的性能,并将其与具有一个元素的标准Stream实现进行比较。

这是使用JMH的一种方法。 第一个测试(计数)仅对流中的元素数进行计数,第二个测试(forEach)对流中的一个元素执行某些操作。

@Benchmark
public long singletonStreamCount() {return SingletonStream.of("A").count();
}@Benchmark
public long streamCount() {return Stream.of("A").count();
}@Benchmark
public void singletonStreamForEach() {SingletonStream.of("A").limit(1).forEach(blackHole());
}@Benchmark
public void streamForEach() {Stream.of("A").limit(1).forEach(blackHole());
}private static <T> Consumer<T> blackHole() {
return t -> {};
}

在MacBook Pro笔记本电脑上运行时,将产生以下结果:

...
Benchmark                               Mode  Cnt           Score   Error  Units
SingletonBench.singletonStreamCount    thrpt        333419753.335          ops/s
SingletonBench.singletonStreamForEach  thrpt       2312262034.214          ops/s
SingletonBench.streamCount             thrpt         27453782.595          ops/s
SingletonBench.streamForEach           thrpt         26156364.956          ops/s
...

“计数”操作的加速因子超过10。 对于“ forEach”操作,看来JVM能够完全优化SingletonStream的完整代码路径。

测试一下

使用Speedment 初始化程序下载Speedment。

完整的测试课程在这里可用。

结论

SingletonStream或多或少地作为扩展的Optional起作用,并在保持Stream库优点的同时提供高性能。

您可以通过将STRICT值设置为首选的严格性/性能选择来选择它的两个版本。

SingletonStream可以进一步改进。

翻译自: https://www.javacodegeeks.com/2018/10/java-gain-performance-singletonstream.html

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

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

相关文章

php调用pdf2html,php html2pdf

*安装composer运行html2pdf时&#xff0c;readme里面建议按照composer-setup.exe安装过程中出现openssl的问题&#xff0c;在php.ini中开启相应extension即可&#xff0c;路径写绝对路径&#xff0c;否则按默认路径找不到在html2pdf的文件路径下&#xff0c;cmd运行composer in…

JDK 11:新的默认收集方法toArray(IntFunction)

“ JDK 11 Early-Access发行说明 ”表明JDK 11的Early Access Build 20在Collection接口上包括一个新的默认方法 &#xff0c;该方法 “允许将集合的元素转移到所需运行时类型的新创建的数组中”。 这个新的默认方法 [ Collection.toArray&#xff08;IntFunction&#xff09; …

获取清空textarea的文字内容_运用|你会做 词云图(文字云) 吗?

词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨。今天&#xff0c;兰色就分享一下词云图的做法。制作步骤&#xff1a;1、打开词云图网站打开网页https://wordart…

如何在Spring Boot App中集成H2数据库

你好朋友&#xff0c; 在本教程中&#xff0c;我们将尝试探索如何在Spring Boot应用程序中与H2数据库集成。 在进行检查之前&#xff0c;让我们了解有关H2数据库的一些基础知识&#xff0c;如下所述&#xff0c;然后我们将讨论H2数据库与Spring Boot的集成。 什么是H2数据库…

python在路径里添加变量_想学Python?那就先从头开始吧!

作为人工智能和大数据时代最具竞争力的 Python 语言&#xff0c;越来越多的出现在各大编程热搜排行榜上。首先你要了解什么是python了解Python语言Python是一种解释型, 面向对象, 动态数据类型的高级程序设计语言.Python由Guido van Rossum&#xff08;荷兰&#xff09; 于1989…

ant 走马灯面板指示显示不出来_触摸屏报警信息显示设置方法

人机界面(HMI)是自动化设备中非常常用的器件&#xff0c;用于替代操作面板上的实体按钮或者显示指示。人机界面的适用极大的减小了设备操作面板的尺寸&#xff0c;提升了设备的整体美观度。随着自动化设备的自动化程度的提高&#xff0c;也对设备的报警信息提出了更高的要求。如…

oracle bbed 使用,Oracle BBED使用 四步快速启动Oracle BBED

Oracle BBED使用&#xff0c;四步快速启动Oracle BBED&#xff0c;环境&#xff1a;Oracle 10g RHEL 5.8&#xff0c;介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Oracle blo环境&#xff1a;Oracle 10g RHEL 5.8介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Or…

linux内核4.4和4.5,[图]Linux Kernel 4.5系列第4个维护版本发布

Greg Kroah-Hartman表示&#xff1a;“我今天宣布了Linux 4.5.4内核&#xff0c;所有Linux 4.5内核系列用户必须尽快升级。已经升级的4.5.y git tree能够在git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.5.y中获取&#xff0c;也能通过访问h…

域名是如何被墙的_如何快速搭建属于自己的个性网站?

说明一直以来都是用GithubPage搭建的博客&#xff0c;因为服务器在国外&#xff0c;访问速度一直比较慢&#xff0c;再后来有一批服务器被墙掉了导致国内网络环境直接无法访问。这里可以多说一句&#xff0c;GithubPage跟Github用的可以不是同一IP地址服务器&#xff0c;被墙很…

python 对象锁_也许你对 Python GIL 锁的理解是 错的。

摄影&#xff1a;产品经理甜白与草莓更配~我刚到现在这个公司时&#xff0c;听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说&#xff1a;Python 有 GIL 锁&#xff0c;所以它的多线程实际上是单线程&#xff0c;所以写多线程代码不用考虑线程冲突&#xff0c;不用加…

服务性服务–服务到服务的通话

在上一篇文章中&#xff0c;我介绍了如何使用Knative的 Serving功能来运行示例Java应用程序。 这篇文章将介绍部署两个应用程序的步骤&#xff0c;其中一个应用程序调用另一个。 样品细节 整个示例可在我的github存储库中找到– https://github.com/bijukunjummen/sleuth-webf…

linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现

在目前以IPv4为支撑的网络协议上搭建的网络环境中&#xff0c;SYN Flood是一种非常危险而常见的DoS攻击方式。到目前为止&#xff0c;能够有效防范SYN Flood攻击的手段并不多&#xff0c;而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明…

用置换破坏您的JUnit5测试

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。 在本文中&#xff0c;我将使用Java流ORM Speedment&#xff0c;因为它包含一个现成的Permutation类&#xff0c;从而帮助我节省了开发时间。…

企业应用程序开发框架的分类

如果您使用的是“最佳Java框架”&#xff0c;那么您很可能会迷失本文 &#xff0c;它对Java Enterprise世界中的情况进行了很好的概述。 但是&#xff0c;从我的角度来看&#xff0c;它缺少一件非常重要的事情–对上述框架进行分类。 让我们看看这个生态系统的另一个角度&…

c语言中怎么定义的字符串,C语言中定义字符串的几种方式

1&#xff0c;什么是字符串&#xff1f;所谓字符串本质上就是以\0作为结尾的特殊字符数组&#xff1b;2&#xff0c;定义字符串的过程中有哪些注意点由于字符串本质上其实就是以\0作为结尾的特殊字符数组&#xff0c;所以定义字符串时&#xff0c;必须保证字符串存储的最后一个…

java8 linq4j_Java 8仍然需要LINQ吗? 还是比LINQ更好?

java8 linq4j长期以来&#xff0c; LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monad &#xff0c;它使C&#xff03;语言跃居Java之前&#xff0c;Java在当时是版本6&#xff0c;但仍在讨论泛型类型擦除的优缺点。 这项…

mongodb上一篇下一篇_如何使用Microsoft office word—上一篇

从这一期开始&#xff0c;将会逐一介绍Microsoft office的几个常用的软件&#xff0c;例如word ppt excel等&#xff0c;每一个软件将分为几期介绍&#xff0c;这几期介绍word。注意&#xff1a;介绍软件版本是Microsoft office365。如何插入图片首先打开word&#xff0c;点击插…

Istio的零停机滚动更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术&#xff08;例如Istio&#xff09;通常与容器编排结合使用。 Istio以…

android 设置资源,Android 资源

Android 资源Android Resources02/01/2018本文内容本文介绍了 Xamarin 中 Android 资源的概念&#xff0c;并介绍了如何使用这些资源。其中介绍了如何使用 Android 应用程序中的资源来支持应用程序本地化和多个设备&#xff0c;包括不同的屏幕大小和密度。This article introdu…

仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?

摩拜单车通过车身携带的GPS而实现单车定位&#xff0c;但是我们知道ofo是没有安装GPS&#xff0c;它又是如何实现单车定位的呢&#xff1f;我居住的地方距离地铁站步行大约15分钟左右&#xff0c;距离最近的商场步行将近30分钟&#xff0c;距离周边的便利店,水果店,饭店等步行1…