Google Guava - 使用Ordering()是否比使用Comparator更快地进行排序?

时间:2016-03-08 07:09:01

标签: java guava

除了丰富比较器之外,Ordering()是否提供了比使用基本比较器更好的性能?

Ordering()最适合用例而不是比较器的情况是什么?

2 个答案:

答案 0 :(得分:2)

有一个import java.lang.Double SparkDataFrame.map{r => val doubleArray = for (i <- 5 to 1000){ Double.parseDouble(r.get(i).toString) }.toArray Vectors.dense(doubleArray) } 方法,它将Comparator作为参数。订购比较器。因此,无论您使用比较器还是使用订单调用Collections.sort(),都会使用完全相同的排序算法。

唯一的区别可能在于比较器/排序的代码。订购通常由来自比较器创建,并且仅委托。这是ComparatorOrdering比较方法的代码:

Collections.sort()

因此,如果您使用比较器进行排序,或者使用包装此同一比较器的Ordering进行排序,则性能几乎相同。 &#34; raw&#34;可能会有更好的表现。比较器,因为它没有委托Ordering具有的另一个对象的成本。但是这个成本可能是0,因为JIT最有可能会推动代表团。

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

答案 1 :(得分:0)

如果您看到ordering的定义,则发现类似

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

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