为什么我的 Haskell 选择排序实现非常快?

Art*_*hur 4 sorting performance haskell

我实现了选择排序并将其与 Data.List 的排序进行了比较。它比 Data.List 的排序快几个数量级。如果我将其应用于 10,000 个随机生成的数字,结果如下:

 ? in 1.22µs: Selection sort
 ? in 9.84ms: Merge sort (Data.List)
Run Code Online (Sandbox Code Playgroud)

这不可能是对的。首先,我认为合并排序的中间结果可能会被缓存,而选择排序使用这些结果会更快。即使我注释掉合并排序和仅时间选择排序,它也是如此之快。我还验证了输出并正确排序。

是什么导致了这种行为?

我使用此代码进行测试:

 ? in 1.22µs: Selection sort
 ? in 9.84ms: Merge sort (Data.List)
Run Code Online (Sandbox Code Playgroud)

ama*_*loy 11

你写

let !v = sorter vals
Run Code Online (Sandbox Code Playgroud)

这是“严格的”,但仅限于 WHNF。因此,您只是在计算找到列表中最小元素所需的时间,而不是对整个内容进行排序所需的时间。选择排序正是从这样做开始的,因此对于这个不正确的基准测试来说它是“最佳的”,而如果您只查看第一个元素,合并排序会做更多“浪费”的工作。

  • @Arthur你看过[`criterion`](https://hackage.haskell.org/package/criterion)基准测试库吗?它用注意力来管理这种微妙的诡计。例如,有一个“nf”函数可以将值转换为正常形式,并对其进行完整评估。 (8认同)