Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用CompareToBuilder是否被认为效率低下?_Java_Sorting_Comparator - Fatal编程技术网

Java 使用CompareToBuilder是否被认为效率低下?

Java 使用CompareToBuilder是否被认为效率低下?,java,sorting,comparator,Java,Sorting,Comparator,在同行评议期间,一位开发人员一想到要实现我选择按3个属性排序的compareToBuilder解决方案就感到震惊。他认为我的类中的compareTo方法会为每个单独的比较创建过多的比较器,并且应用程序会对性能产生巨大的影响。他建议我使用BeanComparator和ComparatorUtils来链接比较器 这是我的班级: public class EmployeeComparator implements Comparator<Employee> { @Override publ

在同行评议期间,一位开发人员一想到要实现我选择按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();
}
然而,我不知道这是不是真的。我找不到任何迹象表明使用链式比较器会对性能造成重大影响。我仔细阅读了apache文档,似乎这是类()的标准实现。我唯一担心的是,通过添加“Comparator.nullsLast”,我创建了一个怪物

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

任何解释为什么这是一种不好的做法或解释CompareToBuilder到底在做什么的帮助都将不胜感激。

代码评审:微优化之家。基于如此有限的信息,我不明白他怎么能预测这将是“对性能的巨大打击”

您的代码是否有比X更快的非功能性要求?如果没有,请忽略他的评论。您的代码是可读的、可重用的和可维护的。它是否比严格要求的要多进行1次或2次闪电般的比较并不重要。除非你一次对这些东西进行数以百万计的比较,否则实际上不会有任何实际的区别。任何花在思考上的时间都是浪费时间


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

  • 衡量是否存在合法问题
  • 确定可接受性能的级别
  • 优化代码并重新测量,直到至少达到可接受的程度
  • 必要时重复代码检查:微优化之家。基于如此有限的信息,我不明白他怎么能预测这将是“对性能的巨大打击”

    您的代码是否有比X更快的非功能性要求?如果没有,请忽略他的评论。您的代码是可读的、可重用的和可维护的。它是否比严格要求的要多进行1次或2次闪电般的比较并不重要。除非你一次对这些东西进行数以百万计的比较,否则实际上不会有任何实际的区别。任何花在思考上的时间都是浪费时间


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

  • 衡量是否存在合法问题
  • 确定可接受性能的级别
  • 优化代码并重新测量,直到至少达到可接受的程度

  • 根据需要重复使用CompareToBuilder(从源代码看),CompareToBuilder的使用效率似乎相当高。与硬编码比较相比,它涉及一个额外的实例创建(仅包含一个int字段)和append()调用(可能由热点编译器内联)。它必须经过所有尾部比较,即使第一次比较已经决定了结果


    以这种方式实现它,然后对系统进行分析。如果EmployeeComparator需要花费大量时间,请再想一想:但是我想更快的compareTo()实现不会有多大帮助。

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


    以这种方式实现它,然后对系统进行分析。如果EmployeeComparator需要花费大量时间,请再想一想:但是我想更快的compareTo()实现不会有多大帮助。

    我投票将这个问题作为离题题来结束,因为它属于可理解的问题。我会把它贴在那里。我投票把这个问题作为离题来结束,因为它属于可以理解的问题。我会把它贴在那里。我同意,但是当你说要分析它的时候,你把他的同事的意见看得太重了。无论如何,他该如何决定什么是“重要时间”?我敢打赌,在他们的应用程序中,有比简单地排序一个列表更糟糕的性能瓶颈。当我说“对系统进行分析”时,我指的是一个整体分析,而不是一个专注于比较器的具体分析。我总是建议花一两个小时在分析条件下运行软件系统并查看结果。我们在其他质量方面花费了太多的时间,所以一个简短的先发制人的效率分析也应该可以。这不仅是为了满足需求,而且是为了我们的CPU浪费电能的责任,我在理论上同意,但你是凭空创造需求。从商业的角度来看,那只不过是浪费时间。@Michael:对不起,我是德国人,我们(有时)追求完美,而不仅仅是足够好的质量;-)我同意,但当你说要分析他的同事的意见时,你把他的意见看得太重了。无论如何,他该如何决定什么是“重要时间”?我敢打赌,在他们的应用程序中,有比简单地排序一个列表更糟糕的性能瓶颈。当我说“对系统进行分析”时,我指的是一个整体分析,而不是一个专注于比较器的具体分析。我总是建议花一两个小时在分析条件下运行软件系统并查看结果。我们在其他质量方面花费了太多的时间,所以一个简短的先发制人的效率分析也应该可以。这不仅仅是关于米蒂
    Collections.sort(outputRecordList, Comparator.nullsLast(new EmployeeComparator()));