2016-03-08 14 views
0

除了丰富比较器之外,Ordering()是否提供了比使用基本比较器更好的性能?谷歌Guava - 使用Ordering()使排序比使用Comparator更快吗?

Ordering()最适合用例而非比较器的场景是什么?

+1

订购**是**比较器。 –

+0

我想知道Collections.sort(list,Comparator)vs Collections.sort(list,Ordering)之间的性能差异 –

+2

'Ordering'提供创建和使用比较器的便捷方法。它不应该在任何特定的Comparator实现上提供性能增强,尽管Guava通常尽可能地优化性能(参见Javadoc to ['Ordering.immutableSortedCopy()'](http://docs.guava-libraries.googlecode。 com/git/javadoc/com/google/common/collect/Ordering.html#immutableSortedCopy(java.lang.Iterable))。 – shmosel

回答

2

有一个单一的Collections.sort()方法,它将一个比较器作为参数。并且订购比较器。因此,无论您使用Comparator还是Ordering调用Collections.sort(),都会使用完全相同的排序算法。

唯一的区别可能是比较器/排序的代码。一个订单通常是比较,并且只有代表它。这里的ComparatorOrdering的比较方法的代码:

public int compare(T a, T b) { 
    return comparator.compare(a, b); 
} 

因此,如果您使用排序比较,或者如果您使用排序,它包装此相同的比较排序,性能会几乎相同。 “原始”比较器的性能可能稍好一些,因为它不具有委托Ordering所具有的另一个对象的成本。但是这个成本可能是0,因为JIT很可能会联合代表团。

无论如何,Ordering的几乎所有的静态工厂方法和实例方法现在都存在于纯Java 8中。因此,如果Ordering的功能存在,而您在JDK中找不到,那么请使用Ordering。否则,只需使用比较器即可。性能差异,如果有的话,可以忽略不计。

+0

我从你的回答中假设,没有速度差异。 –

0

,如果你看到的ordering定义你找到东西像

@GwtCompatible 
public abstract class Ordering<T> 
extends Object 
implements Comparator<T> 

这意味着它内部的Comparator一个孩子。我不是在谈论efficiency。但根据我的假设,它永远不会更快,因为Comaparator比任何其他子Comparator(如订购Interface更本地和更接近Java。因此比较器必须比其他任何更有效率。 Ordering Class Google Docs

+0

“比较器”本身没有实现。讨论'Comparator'作为一个接口的效率是没有意义的。 – shmosel