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 排序性能

java 排序性能_Java8排序–性能陷阱相关推荐

  1. 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)

    首先证明一波排序算法的运算性能,如下图.对于50万个数据的无序列表,时间复杂度为的桶排序和计数排序明显比复杂度为的归并排序和快速排序性能好至少一个数量级. 1. 计数排序  1.1 基本原理:首先确定 ...

  2. 关于几种排序算法的时间性能比较

    以前经常看到各种排序算法,今天也对以下6种排序算法的时间性能做了一次测试: 测试代码地址 1. 冒泡排序 O(n^2) /** 冒泡排序 @Param {[]int} arr 整形切片 */ func ...

  3. 排序算法——各算法性能

    各排序算法的性能总结 最后,在这里对前面所写的八众排序进行一个算法性能总结. 到这里,八种排序算是全部写完了.

  4. 【数据结构】常见的排序方法的实现以及性能对比

    前言: 排序算法在笔试和面试的时候经常出现,有时候面试官可能不止问我们排序的写法,还会问相关算法的一些性能的比较.平时学习时,由于排序算法较多,如果不做一些归纳总结的话,很容易混为一谈,并且没有对每个 ...

  5. Java内存访问重排序的研究

    什么是重排序 请先看这样一段代码1 public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0 ...

  6. java list数组排序_浅谈对象数组或list排序及Collections排序原理

    常需要对list进行排序,小到List,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List进行排序,继而讲到Collection ...

  7. Java Set接口详细讲解 TreeSet的定制排序和自然排序

    Set接口概述 Set接口是Collection的子接口,set接口没有提供额外的方法 Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败. Set 判断 ...

  8. 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()

    对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...

  9. java 数据结构和算法 排序

    排序算法 排序算法的介绍 算法的时间复杂度 **度量一个程序(算法)执行时间的两种方法** **时间频度** **时间复杂度** **常见的时间复杂度** 平均时间复杂度和最坏时间复杂度 算法的空间复 ...

最新文章

  1. APDU命令的结构和处理【转】
  2. VS2010-2015对C++11/14/17特性的支持
  3. 《Android开发艺术探索》读书笔记——Cha3.2.2使用动画实现View的滑动
  4. Java写手机专题分析接口_jeesite学习文档API-内容管理模块
  5. 1.3 Hive架构原理
  6. LINUX下用脚本实现JDK+TOMCAT
  7. Springboot + Mybatis + Ehcache
  8. Redis数据存储解决方案
  9. django导入mysql_django如何直接对数据库进行插入操作?
  10. cisco交换机命令大全(11)
  11. 萨维奇(Savitch)定理证明
  12. 没有方案你抱怨;有了方案你会认真看吗?
  13. 单门课程成绩管理系统用c语言,[转载]C语言课程设计——学生成绩管理系统
  14. (附源码)springboot助农电商系统 毕业设计 081919
  15. AS移动开发 类微信界面2_Activity的生命周期与跳转(持续更新中)
  16. ddrelease64 黑苹果_有老哥会看黑苹果哆嗦模式问题出在哪里的吗?
  17. Proteus STM32仿真学习板
  18. 长篇分享腾讯工作的环境、待遇等
  19. 华为matepad切换电脑模式_华为MatePad Pro关于PC模式常用操作指南
  20. 我国企业履行社会责任的措施

热门文章

  1. nssl1216-码灵鼠【数学】
  2. 【做题记录】DP 杂题
  3. 1D/1D动态规划的三种优化方法
  4. codeforces Cable Connection
  5. 2、mybatis的基本使用
  6. mybatis源码阅读(四):mapper(dao)实例化
  7. Spring MVC 到底是如何工作的
  8. 集合框架 Queue---ArrayBlockingQueue
  9. javaweb项目搭建ehcache缓存系统
  10. Oracle入门(十四.18)之使用动态SQL