Google Guava - 使用 Ordering() 比使用 Comparator 排序更快吗?
Google Guava - Does using Ordering() make sorting faster than using Comparator?
除了丰富比较器之外,与使用基本比较器相比,Ordering() 是否提供了性能改进?
Ordering() 最适合用例而不是比较器的场景是什么?
如果您看到 ordering
的定义,您会发现类似
的内容
@GwtCompatible
public abstract class Ordering<T>
extends Object
implements Comparator<T>
内部表示Comparator
的child。我不是在谈论 efficiency
。但根据我的假设,它永远不会更快,因为 Comaparator
比 Comparator
的任何其他 Child (如 Ordering) Interface
。因此 Comparator 必须比其他任何一个都更有效。
Ordering Class Google Docs
有一个 Collections.sort()
方法,它以 Comparator 作为参数。一个排序 是一个 比较器。因此,无论您使用比较器还是使用排序调用 Collections.sort()
,都使用完全相同的排序算法。
唯一的区别可能在于 comparator/ordering 的代码。一个 Ordering 通常是 从 一个 Comparator 创建的,并且只有 delegates 给它。这是 ComparatorOrdering 的比较方法的代码:
public int compare(T a, T b) {
return comparator.compare(a, b);
}
因此,如果您使用比较器进行排序,或者如果您使用包装同一比较器的排序进行排序,性能将几乎相同。 "raw" 比较器的性能可能稍好一些,因为它没有委托给 Ordering 具有的另一个对象的成本。但是这个成本可能是 0,因为 JIT 很可能会内联委托。
无论如何,几乎所有静态工厂方法和 Ordering 的实例方法现在都存在于 Java 8 中。因此,如果存在您在 [=30= 中找不到的 Ordering 功能],然后使用排序。否则,只需使用比较器。性能差异(如果有的话)可以忽略不计。
除了丰富比较器之外,与使用基本比较器相比,Ordering() 是否提供了性能改进?
Ordering() 最适合用例而不是比较器的场景是什么?
如果您看到 ordering
的定义,您会发现类似
@GwtCompatible
public abstract class Ordering<T>
extends Object
implements Comparator<T>
内部表示Comparator
的child。我不是在谈论 efficiency
。但根据我的假设,它永远不会更快,因为 Comaparator
比 Comparator
的任何其他 Child (如 Ordering) Interface
。因此 Comparator 必须比其他任何一个都更有效。
Ordering Class Google Docs
有一个 Collections.sort()
方法,它以 Comparator 作为参数。一个排序 是一个 比较器。因此,无论您使用比较器还是使用排序调用 Collections.sort()
,都使用完全相同的排序算法。
唯一的区别可能在于 comparator/ordering 的代码。一个 Ordering 通常是 从 一个 Comparator 创建的,并且只有 delegates 给它。这是 ComparatorOrdering 的比较方法的代码:
public int compare(T a, T b) {
return comparator.compare(a, b);
}
因此,如果您使用比较器进行排序,或者如果您使用包装同一比较器的排序进行排序,性能将几乎相同。 "raw" 比较器的性能可能稍好一些,因为它没有委托给 Ordering 具有的另一个对象的成本。但是这个成本可能是 0,因为 JIT 很可能会内联委托。
无论如何,几乎所有静态工厂方法和 Ordering 的实例方法现在都存在于 Java 8 中。因此,如果存在您在 [=30= 中找不到的 Ordering 功能],然后使用排序。否则,只需使用比较器。性能差异(如果有的话)可以忽略不计。