2016-03-08 18 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