java 排序性能_Java8排序–性能陷阱

java 排序性能

Java 8带来了lambda的所有优点,使我们能够使用声明式样式进行编程。 但这真的免费吗? 我们是否应该担心必须为新的编程功能付出的代价?

这是一个我们可能要担心的例子。

考虑对这个简单类的实例进行排序:

private static class MyComparableInt{private int a,b,c,d;public MyComparableInt(int i) {a = i%2;b = i%10;c = i%1000;d = i;}public int getA() { return a; }public int getB() { return b; }public int getC() { return c; }public int getD() { return d; }
}

我们可以使用新的Java 8声明性语法进行排序,如下所示:

List<MyComparableInt> mySortedComparableList = myComparableList.stream().sorted(Comparator.comparing(MyComparableInt::getA).thenComparing(MyComparableInt::getB).thenComparing(MyComparableInt::getC).thenComparing(MyComparableInt::getD)).collect(Collectors.toList());

或者我们可以使用以下代码对旧方法进行排序(仍然使用lambdas):

List<MyComparableInt> mySortedComparableList = myComparableList.stream().sorted(MyComparableIntSorter.INSTANCE).collect(Collectors.toList());public enum MyComparableIntSorter implements Comparator<MyComparableInt>{INSTANCE;@Overridepublic int compare(MyComparableInt o1, MyComparableInt o2) {int comp = Integer.compare(o1.getA(), o2.getA());if(comp==0){comp = Integer.compare(o1.getB(), o2.getB());if(comp==0){comp = Integer.compare(o1.getC(), o2.getC());if(comp==0){comp = Integer.compare(o1.getD(), o2.getD());}}}return comp;}}

当我使用10m个对象运行该测试时,使用声明性语法进行排序的时间约为6.5s,而使用旧语法仅进行了1.5s的时间。 差不多是原来的四倍!

那么时间在哪里呢? 大概在thenComparing方法之间进行编组是开销。

有趣的是,如果您尝试完全相同的测试,但将int替换为String,则时间变化如下。 同样,对于10m个对象,使用新语法大约需要11.5s,而旧语法大约需要7s。 使用String时,当编组的重要性降低时,新语法的使用时间仅为旧语法的1.5倍。

总而言之,尽管新语法看起来不错并且表现力极佳,但是如果您担心性能,则应该坚持使用旧语法。

再一次,似乎没有免费的午餐!

翻译自: https://www.javacodegeeks.com/2015/01/java8-sorting-performance-pitfall.html

java 排序性能

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

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

相关文章

delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...

前言随着Elastic的上市&#xff0c;ELK不仅在互联网大公司得到长足的发展&#xff0c;而且在各个中小公司都得到非常广泛的应用&#xff0c;甚至连"婚庆网站"都开始使用Elasticsearch了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。因…

为什么C语言函数不能返回数组,却可以返回结构体

C语言函数为什么不能返回数组&#xff1f;在C语言程序开发中&#xff0c;我们不可以编写下面这样的代码&#xff1a;char f(void[8]{ char ret;// ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10];obj_a f(); }不可以编写这样的代码这其实就是不能…

oracle迁移mysql_从自建Oracle迁移至RDS MySQL

#本示例以名称为dtstest的数据库账号为例介绍授权命令&#xff0c;需要对PDB和CDB同时授权#PDB授权示例&#xff1a;create user dtstest IDENTIFIED BY rdsdt_dtsacct;grant create session to dtstest;grant connect to dtstest;grant resource to dtstest;grant select on a…

2015年传智播客java_2015年Java 8强势开始

2015年传智播客javaJDK 8从2015年开始&#xff0c;其博客文章和文章的受欢迎程度将激增。 这与本月将 Java 自动升级到JDK 8恰好吻合。 在这篇文章中&#xff0c;我列出并简要描述了2015年已经发布的许多有关JDK 8的文章和帖子。 JDK 8 Streams在最近的帖子中理所当然地受欢迎…

python文件运行哪一个_如何使一个python文件运行另一个?

本问题已经有最佳答案&#xff0c;请猛点这里访问。 如何创建一个python文件来运行另一个&#xff1f; 例如&#xff0c;我有两个.py文件。我想运行一个文件&#xff0c;然后让它运行另一个.py文件。 docs.python.org / / modules.html教程 所以我execfile()模块通常是更好的。…

C语言printf()函数具体解释和安全隐患

程序员都知道&#xff0c;也都会使用printf函数&#xff0c;但你知道它也有“安全隐患”吗&#xff1f;下面就来举例我说说&#xff1a;嵌入式专栏1问题描述打印输出的数据并不是理论值&#xff0c;如下图&#xff08;右边&#xff09;&#xff1a;嵌入式专栏2进一步描述问题请…

brew search mysql_brew mysql

1、homebrew安装/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、命令使用安装软件&#xff1a;brew install 软件名&#xff0c;例&#xff1a;brew install wget搜索软件&#xff1a;brew search 软件名&a…

spring 请求转码_Spring请求级备忘录

spring 请求转码介绍 备注化是一种方法级别的缓存技术&#xff0c;用于加快连续调用的速度。 这篇文章将演示如何仅使用Spring AOP实现任何数据源的请求级可重复读取。 Spring缓存 Spring提供了非常有用的缓存抽象 &#xff0c;允许您将应用程序逻辑与缓存实现细节分离。 Sp…

java map 如何根据key获得对象_ThreadLocal:Java中的影分身

关于ThreadLocal&#xff0c;你有哪些疑问&#xff1f;ThreadLocal是用来解决什么问题的&#xff1f;如何使用ThreadLocal&#xff1f;ThreadLocal的实现原理是什么&#xff1f;可否举几个实际项目中使用ThreadLocal的案例&#xff1f;基础知识ThreadLocal是线程局部变量&#…

【C语言】你可能对 sizeof() 有点误解。。。

各位&#xff0c;今天还是按照惯例给大家分享一个C语言容易出现的小错误&#xff0c;这也是跟sizeof有关的&#xff0c;问题虽小&#xff0c;却可管中窥豹&#xff0c;话不多说&#xff0c;代码先行&#xff1a;#include int main() { int i; i 8; printf("%d\…

mysql cluster 设置单向复制_mysql单向主从配置

1.环境要求操作系统&#xff1a;centOS6.5或以上Mysql版本&#xff1a;mysql5.5主机配置&#xff1a;4核CPU、4G内存2.主从复制的方式mysql5.6开始主从复制有两种方式&#xff1a;基于日志(binlog)、基于GTID(全局十事务标示符)&#xff0c;下面主要介绍基于日志(binlog)的复制…

java处理注释_如何处理Java注释

java处理注释Java 8的一项很酷的新功能是对lambda表达式的支持。 Lambda表达式在很大程度上依赖于FunctionalInterface 注释 。 在本文中&#xff0c;我们将介绍注释以及如何处理它们&#xff0c;以便您可以实现自己的出色功能。 注解 Java 5中添加了注释 。Java语言附带了一…

nginx tcp转发_Nginx学习(九):负载均衡服务

介绍对于请求而言&#xff0c;负载均衡能很好的均摊请求&#xff0c;提高服务端吞吐率和整体性能&#xff0c;多个服务节点部署的方式&#xff0c;也提高了容灾和服务高可用。一、负载均衡分类负载均衡分为&#xff1a;GSLB和SLB。1. GDLB全局负载均衡&#xff0c;往往按照国家…

控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

前言在我们开发中可能需要设计一次性应用程序&#xff0c;这些实用程序可以利用接近原始源代码的优势&#xff0c;但可以在与主Web应用程序完全独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了原因。创建控制台应用打开命令…

C语言函数为什么不能返回数组?

C语言函数为什么不能返回数组&#xff1f;在C语言程序开发中&#xff0c;我们不可以编写下面这样的代码&#xff1a;char f(void)[8] {char ret; // ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10]; obj_a f(); }不可以编写这样的代码这其实就是不…

mockito_书评:Mockito Essentials

mockitoSujoy Acharya的Mockito Essentials副标题&#xff08; Packt出版 &#xff0c;2014年10月&#xff09;是&#xff1a;“实用指南&#xff0c;可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

python3 byte 字面值_bytearray() Python 内置函数

转载须注明出处&#xff1a;简书Orca_J35 | GitHuborca-j35 class bytearray([source[, encoding[, errors]]]) 该内置函数本质上是 bytearray 类的构造函数&#xff0c;用于创建一个 bytearray 实例。bytearray 实例是一个由字节(8-bits 无符号)构成的可变序列&#xff0c;并拥…

python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...

之前小编给大家介绍了用python去返回了一个值&#xff0c;立马就有小伙伴跟小编留言说道“能都执行多个内容&#xff1f;”于是&#xff0c;小编就给大家整理最细致&#xff0c;也是最简单的实现方法&#xff0c;方便大家理解学习&#xff0c;一起来看下吧~直接上代码&#xff…

Java EE 8怎么了? (第2部分)

Java EE 8的工作仍处于初期阶段&#xff0c;并有望在来年跟上发展步伐&#xff0c;届时我们将看到专家组的完成&#xff0c;围绕用例/功能的更多讨论&#xff0c;大量JIRA和各种规范的草案版本&#xff08;本会很有趣&#xff01;&#xff09;。 在第1部分中 &#xff0c;我们…

C语言中quot;##quot;的独特用法

市面上有很多比较火的编程语言&#xff0c;比如Python、 JAVA、 Go等&#xff0c;你可能觉得C语言很古老、很落后。如果你有这种想法&#xff0c;那可能你只是一个初学的菜鸟。可能绝大部分 C 程序员都不知道"##"隐藏用法&#xff0c;下面就来给大家讲讲。一、##的“…