Mic*_*may 3 sorting performance scala
我正在根据自定义排序对整数索引进行一些排序.我发现这里使用的Ordering [T]使用直接调用compare方法比使用手工制作的quickSort慢至少10倍.这看起来非常昂贵!
val indices: Array[Int] = ...
class OrderingByScore extends Ordering[Int] { ... }
time { (0 to 10000).par.foreach(x => {
scala.util.Sorting.quickSort[Int](indices.take(nb))(new OrderingByScore)
})}
// Elapsed: 30 seconds
Run Code Online (Sandbox Code Playgroud)
与手工制作的sortArray相比,此处可以修改以添加ord: Ordering[Int]参数:
def sortArray1(array: Array[Int], left: Int, right: Int, ord: Ordering[Int]) = ...
time { (0 to 10000).par.foreach(x => {
sortArray1(indices.take(nb), 0, nb - 1, new OrderingByScore)
})}
// Elapsed: 19 seconds
Run Code Online (Sandbox Code Playgroud)
最后,相同的代码片段,但使用精确类型而不是(ord: OrderingByScore):
def sortArray2(array: Array[Int], left: Int, right: Int, ord: OrderingByScore) = ...
time { (0 to 10000).par.foreach(x => {
sortArray2(indices.take(nb), 0, nb - 1, new OrderingByScore)
})}
// Elapsed: 1.85 seconds
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现每个版本之间存在这样的差异!
在我的示例中,indices数组基于在包含组合分数的另一个Doubles数组中找到的值进行排序.此外,排序是稳定的,因为它使用索引本身作为次要比较.另外,为了使测试可靠,我必须在并行循环中使用"indices.take(nb)",因为排序会修改输入数组.与我带来的问题相比,这种惩罚可以忽略不计.对要点的完整代码在这里.
您的建议非常受欢迎,以改善..但尽量不要改变索引和分数数组的基本结构.
注意:我在scala 2.10 REPL中运行.