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

Java8排序–性能陷阱相关推荐

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

    java 排序性能 Java 8带来了lambda的所有优点,使我们能够使用声明式样式进行编程. 但这真的免费吗? 我们是否应该担心必须为新的编程功能付出的代价? 这是一个我们可能要担心的例子. 考虑 ...

  2. java8的sorted,Java8排序stream.sorted()

    使用Java8排序stream.sorted() sorted-example 国外对Java8一系列总结的不错, 翻译过来给你们共享 这篇文章将会讲解Java 8 Stream sorted()示例 ...

  3. [译]PG15加速排序性能

    PG15加速排序性能 介绍 近年来,PG对排序进行了一些改进.PG15的开发周期中,我和Ronan.Dunklau.Thomas Munro.Heikki Linnakangas对PG做了一些更改以加 ...

  4. 贯穿应用开发始终的八大性能陷阱

    数据库访问低效.框架配置错误.内存使用过度.网页臃肿,以及不遵循常见Web性能最佳实践都是应用开发中常见的.影响应用性能的主要陷阱 .技术性能公司Computeware从实际案例总结了贯穿应用始终的八 ...

  5. Java8 Stream性能如何及评测工具推荐

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java ...

  6. 【开发者成长】Vue.js 中有哪些性能陷阱

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 我内心深处对游戏的热爱,让我一直渴望能自己制作一些电子游戏.几个月前我开始将这种梦想变为现实,并第 ...

  7. mysql 中如何增加查询排序性能

    说起优化排序的工作,本人菜鸟一枚,如果百度找到的我想学习请转道,因为我也不能保证一定准确. 如果发现我写的不好请留言,留下微信,我给你发红包 这块的学习领域在高性能mysql中175页使用索引排序,查 ...

  8. memset性能陷阱

    性能杀手:"潜伏"的memset [memset性能陷进] memset是大家常用的函数,而且一般的编程书籍都会谆谆告诫大家:申请内存后要初始化,防止使用未经初始化的内存导致不可预 ...

  9. 避开使用XAML的性能陷阱

    虽然DependencyProperty和DependencyObject是实现大部分XAML特性的基础,但是它们也会带来一些性能开销.MSDN上的一篇文章<XAML平台上的C#优化>(O ...

最新文章

  1. 以太坊第五年,未来该往哪走?
  2. mybatis整合spring下的的各种配置文件
  3. 提示语_《流浪地球》里洗脑的交通提示语怎么来的?吴京可能要“负全责”
  4. 趣学python3(32)-enumerate,zip
  5. python 替换array中的值_利用Python提取视频中的字幕(文字识别)
  6. Lecture 3 Divide and Conquer
  7. 【转载保存】在python中如何用word2vec来计算句子的相似度
  8. 飞鸽传书,去看了下WEBBROWSER的资料
  9. 程序员需要学习太多数学知识吗?
  10. db2存储过程简单写法
  11. overflow与BFC解说
  12. 项目管理学习——PMP 5A高分通过备考经验分享
  13. 局域网内的ARP断网攻击
  14. 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二)
  15. html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
  16. 海康机器人工业相机sdk简介
  17. web页面大数据可视化大屏展示案例分享
  18. C# winfrom NPOI导出Excel 添加视频、音频文件
  19. 数据库管理系统MySQL(一)
  20. [转载]穿透还原卡和还原软件

热门文章

  1. idea部署maven+javaweb项目到jboss
  2. jmc线程转储_查找线程转储中的异常和错误
  3. react提交数据到数据库_React型关系数据库事务
  4. vaadin_Vaadin Flow –奇妙的鹿
  5. 抽象工厂模式设计模式_创新设计模式:抽象工厂模式
  6. 你只是看起来很努力_我的方法在这方面看起来很大吗?
  7. 应行家算法_一些行家技巧和窍门
  8. mockito 静态_在Java 8中使用不带静态导入的Mockito
  9. 502无法解析服务器标头_编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match...
  10. javafx 项目_JavaFX,Jigsaw项目和JEP 253