除了丰富比较器之外,Ordering()是否提供了比使用基本比较器更好的性能?
Ordering()最适合用例而不是比较器的情况是什么?
答案 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
。但根据我的假设,它永远不会更快,因为Comaparator
比Java
Comparator
更加本地化,更接近Interface
的任何其他孩子(如订购){{ 1}}。因此比较器必须比任何其他更有效。
Ordering Class Google Docs