Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么我的Haskell选择排序实现非常快?_Performance_Sorting_Haskell - Fatal编程技术网

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

Performance 为什么我的Haskell选择排序实现非常快?,performance,sorting,haskell,Performance,Sorting,Haskell,我实现了选择排序,并将其与Data.List的排序进行了比较。它比数据快几个数量级。列表排序。如果我将其应用于10000个随机生成的数字,结果如下: ✓ in 1.22µs: Selection sort ✓ in 9.84ms: Merge sort (Data.List) 这不可能是对的。首先,我想也许合并排序的中间结果会被缓存,而选择排序使用这些结果会快得多。即使我注释掉了合并排序和仅时间选择排序,它仍然是如此之快。我还验证了输出,并且正确排序 是什么导致了这种行为 我使用此代码来测

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

 ✓ in 1.22µs: Selection sort
 ✓ in 9.84ms: Merge sort (Data.List)
这不可能是对的。首先,我想也许合并排序的中间结果会被缓存,而选择排序使用这些结果会快得多。即使我注释掉了合并排序和仅时间选择排序,它仍然是如此之快。我还验证了输出,并且正确排序

是什么导致了这种行为

我使用此代码来测试:

{-#语言模式}
模块库
(测试排序算法)
)在哪里
导入系统随机(randomRIO)
导入文本.Printf
导入控制。异常
导入系统.CPUTime
导入数据列表(排序、排序)
选择排序::Ord a=>[a]->[a]
选择排序[]=[]
selectionSort nrs=
let(最小,剩余)=获取最小nrs
在最小值中:selectionSort rest
其中getMinimest::Ord a=>[a]->(a[a])
GetMinister[a]=(a,[]
getminister(a:as)=let(minister,rest)=getminister as
如果最小值>a,则(a,最小值:剩余值)
其他(最小的,a:休息)
main::IO()
main=测试排序算法
testSortingAlgorithms::IO()
testSortingAlgorithms=do
!列出你写的“”

let !v = sorter vals

这是“严格的”,但仅限于WHNF。因此,您只需要计算找到列表中最小元素所需的时间,而不是整个排序所需的时间。选择排序就是这样开始的,因此对于这个不正确的基准来说,它是“最佳的”,而mergesort做了更多的工作,如果只看第一个元素,这些工作是“浪费的”。

Aha。所以它实际上没有完全分类?那么,我如何强制进行完全严格的评估呢?我想这就是为什么。@Arthur也许看看最后一个元素
let!v=最后一个$sorter VAL
?我添加了
let!l=last v
现在计时结果看起来好多了,谢谢@Arthur你看过基准测试库了吗?它专注地处理这一微妙的诡计。例如,有一个
nf
函数将一个值转换为标准形式,并对其进行完整的计算。@IgnatInsarov我没有,但这看起来很有用。感谢