这种CompareToBuilder的使用被认为效率低下吗?

时间:2017-07-31 15:05:29

标签: java sorting comparator

在同行评审期间,开发人员似乎对实现我选择按3个属性排序的compareToBuilder解决方案感到震惊。他的印象是,我的课程中的compareTo方法会为每个单独的比较创建过多的比较器,并且应用程序会对性能产生巨大影响。他建议我使用BeanComparator& ComparatorUtils链式比较器。

这是我的班级:

public class EmployeeComparator implements Comparator<Employee> {

@Override
public int compare(Employee o1, Employee o2) {
    return new CompareToBuilder()
            .append(o1.getJobTitle(), o2.getJobTitle())
            .append(o1.getAge(), o2.getAge())
            .append(o1.getSalary(), o2.getSalary()).toComparison();
}

这是我的实施:

Collections.sort(outputRecordList, Comparator.nullsLast(new EmployeeComparator()));

然而,我实际上并不知道这是否属实。我找不到任何可能表明这对使用链式比较器造成重大性能影响的事情。我挖掘了apache文档,看来这是类的标准实现(https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/builder/CompareToBuilder.html)。我唯一关心的是通过添加&#34; Comparator.nullsLast&#34;,我创造了一个怪物。

我在这个网站上找到了CompareToBulder实现:

http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example

任何帮助要么解释为什么这是不好的做法,要么解释CompareToBuilder究竟在做什么将非常感激。

2 个答案:

答案 0 :(得分:4)

CompareToBuilder对您的使用似乎相当有效(从查看其源代码)。与硬编码比较进行比较时,它涉及一个额外的实例创建(仅包含一个int字段)和append()调用(可能由HotSpot编译器内联)。即使第一次比较已经确定了结果,它也必须经过所有尾部比较。

以这种方式实施,然后对系统进行分析。如果EmployeeComparator占用大量时间,请再想一想:但我想更快的compareTo()实现对此非常有帮助。

答案 1 :(得分:2)

代码评论:微优化的主页。我不知道他怎么能预测它会对表现造成巨大打击&#34;基于这些有限的信息。

您的代码是否存在比X更快的非功能性要求?如果没有,请随意忽略他的评论。您的代码是可读,可重用和可维护的。如果它进行1次或2次闪电般快速比较并不是绝对必要的,那就无所谓了。除非你一次比较数百万的这些东西,否则它实际上没有实际的区别。花在考虑上的任何时间都只是浪费时间。

优化任何代码的正确方法是:

  1. 衡量是否存在合法问题
  2. 决定可接受的性能水平
  3. 优化代码并重新测量,直至至少可以接受
  4. 根据需要重复