与文件夹相比,模式匹配性能更好

时间:2018-06-20 22:53:18

标签: performance haskell pattern-matching fold

这两个函数都是从learnyouahaskell中提取的字典查找的实现

findKeyPatMatch :: (Eq k) => k -> [(k,v)] -> Maybe v
findKeyPatMatch key [] = Nothing
findKeyPatMatch key ((k,v):xs)
    | key == k      = Just v
    | otherwise     = findKeyPatMatch key xs

findKeyFold :: (Eq k) => k -> [(k,v)] -> Maybe v
findKeyFold key = foldr (\(k,v) acc -> if k == key then Just v else acc) Nothing

由于第一个功能中的模式是针对确切的成语文件夹进行的,因此我希望这两个功能都具有相同的性能。但是,模式匹配实现明显更快。 foldr短路,所以我想不出任何特殊原因,除了可能是函数调用开销之外。

testKey = 10^7
testDict = [(i,i) | i <- [1..]]

findKeyPatMatch testKey testDict    -- takes ~3.40 s
findKeyFold testKey testDict        -- takes ~4.10 s

所以我的问题是-性能差异的原因是什么,并且有什么方法可以优化文件夹表达。

0 个答案:

没有答案