java获得电脑性能_Java:使用SingletonStream获得性能

java获得电脑性能

仅具有一个元素的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) ,方法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

java获得电脑性能

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

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

相关文章

SpringBoot与MyBatis技术集成

一 、创建project步骤 目录结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…

Linux 命令之 deluser -- 删除用户

文章目录命令简介常用选项参考示例删除普通用户将用户从用户组中删除删除用户的所有文件命令简介 deluser 命令用于删除用户。将一个用户从一个组中删除&#xff08;即退出用户组&#xff09;&#xff0c;大家都推荐用 usermod&#xff0c;其实 deluser 才是正解。deluser 的选…

ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式

ubuntu安装jdk语句我的上一篇文章“ 玩JDK 12的Switch表达式 ”讨论了使用JDK 12 Early Access Builds尝试JEP 325 switch 表达式和语句的过程&#xff0c;并提供了一个简单的示例。 这篇文章使用相同的JDK 12 Early Access Build 10来演示switch表达式和增强的switch语句的不同…

SpringBoot JPA

一、创建步骤 二、目录结构 三、application.properties配置datasource spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.usernameroot spring.datasource.passwordroot spring.datasource.urljdbc:mysql://localhost/springboot?userUnicod…

Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件

文章目录命令简介常用选项参考示例删除用户命令简介 userdel 命令用于删除指定的用户及与该用户相关的文件&#xff0c;英文全称即“user delete”。在 Debian 上&#xff0c;我们通常会使用 deluser 命令。 其实 userdel 命令实际上是修改了系统的用户账号文件 /etc/passwd、…

RestTemplate入门案例

一、创建步骤注意事项 二、目录结构 三、RestTemplateApplication层 package com.william;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; …

java 示例_功能Java示例 第5部分–将I / O移到外部

java 示例这是称为“ Functional Java by Example”的系列文章的第5部分。 在上一部分中&#xff0c;我们停止了对文档的变异&#xff0c;并返回了数据的副本。 现在&#xff0c;我们需要移走一些I / O。 如果您是第一次来&#xff0c;最好是从头开始阅读。 它有助于了解我们…

Linux 命令之 groupdel -- 删除指定的用户组

命令介绍 groupdel 命令用于删除指定的工作组&#xff0c;本命令要修改的系统文件包括 /ect/group 和 /ect/gshadow。若该群组中仍包括某些用户&#xff0c;则必须先删除这些用户后&#xff0c;方能删除群组。 参考示例 删除指定用户组 删除 linuxcool 工作组&#xff1a; …

模拟微服务业务场景

一、创建步骤 模拟开发过程中的服务间关系。抽象出来&#xff0c;开发中的微服务之间的关系是生产者和消费者关系。 总目标&#xff1a;模拟一个最简单的服务调用场景&#xff0c;场景中保护微服务提供者(Producer)和微服务调用者(Consumer)&#xff0c;方便后面使用微服务架…

Linux 命令之 groupmod -- 更改群组识别码或名称

文章目录命令介绍常用选项参考示例命令介绍 groupmod 命令用于更改群组的识别码或名称时。不过大家还是要注意&#xff0c;用户名不要随意修改&#xff0c;组名和 GID 也不要随意修改&#xff0c;因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名&#xff0c;则建议…

cassandra使用心得_使用Spring Data Cassandra缓存的预备语句

cassandra使用心得今天&#xff0c;我有一篇简短的文章&#xff0c;内容涉及在Spring Data Cassandra中使用Prepared Statements。 Spring为您提供了一些实用程序&#xff0c;使您可以更轻松地使用“预备语句”&#xff0c;而不是依靠自己使用Datastax Java驱动程序手动注册查询…

注册中心 Spring Cloud Eureka

一、搭建eureka-server工程 目录结构 二、导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

Linux 用户(user)和用户组(group)管理概述

文章目录一、理解Linux的单用户多任务&#xff0c;多用户多任务概念二、用户(user&#xff09;和用户组&#xff08;group&#xff09;概念三、用户&#xff08;user&#xff09;和用户组&#xff08;group&#xff09;相关的配置文件、命令或目录一、理解Linux的单用户多任务&…

mockito java_Java:使用Mockito模拟ResultSet

mockito java这篇文章展示了如何使用Mockito模拟java.sql.ResultSet 。 它可用于帮助对ResultSet进行操作的单元测试代码&#xff08;例如ResultSetExtractor &#xff09;而无需依赖外部数据源。 您可以通过提供列名列表和2D数据数组来创建MockResultSet 。 例如&#xff1a;…

服务中心Eureka

一、服务消费者-注册服务中心 测试结果 二、消费者通过Eureka访问提供者 测试结果 Consumer ConsumerController package com.william.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance;…

Linux 命令之 newgrp -- 登入另一个群组

文章目录命令介绍常用选项参考示例切换登录用户组命令介绍 newgrp 命令的英文全称为“new group”&#xff0c;使用该命令指定用户组名称&#xff0c;执行命令后&#xff0c;其实是以相同的用户名&#xff0c;但是以另一个群组名称&#xff0c;再次登入系统。所以本质上是切换…

pivotal_Spring Data Pivotal Gemfire教程

pivotal1. Spring Data Pivotal Gemfire –简介 在这篇文章中&#xff0c;我们将介绍有关Spring Data Pivotal Gemfire的全面教程。 Pivotal Gemfire是由Apache Geode支持的内存中数据网格解决方案。 使用Pivotal Gemfire构建的应用程序使您可以在分布式服务器节点之间轻松扩展…

Linux命令之 chsh -- 用来更换登录系统时使用的shell

文章目录命令简介常用选项参考示例查看系统安装了哪些shell的两种方法查看当前正在使用的 shell修改当前登录用户的shell命令简介 chsh 命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称&#xff0c;则 chsh 会以应答的方式进行设置。 chsh 用于更改登录 shell…

layui绑定json_JSON-B非对称属性绑定

layui绑定jsonJSON-B规范定义了诸如JsonbProperty或JsonbTransient类的绑定注释&#xff0c;以声明方式将Java对象映射到JSON&#xff0c;然后又映射回JSON。 这些注释可以“非对称地”用于定义序列化和反序列化的不同处理。 如果在Java属性上或在getter和setter上都注释了JSO…

熔断器

一、引入依赖 1.consumer_service中加入依赖 <!--开启熔断器--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>2.开启熔断的注解 //注…