我正在使用并行的 Haskell 函数par
,pseq
并且发现了一些有趣的东西。
我的示例基于Real World Haskell的书( Haskell 中的并行编程)中的示例:
常用代码:
import Control.Parallel (par, pseq)
-- <<sorting code goes here>>
force :: [a] -> ()
force xs = go xs `pseq` ()
where go (_:xs) = go xs
go [] = 1
main = do
print $ take 10 $ parSort [0..1000000]
排序代码1(取自书中):
parSort :: (Ord a) => [a] -> [a]
parSort (x:xs) = force greater `par` (force lesser `pseq`
(lesser ++ x:greater))
where lesser = parSort [y | y <- xs, y < x]
greater = parSort [y | y <- xs, y >= x]
parSort _ = []
排序代码 2(我的自定义变体):
parSort :: (Ord a) => [a] -> [a]
parSort (x:xs) = force greater `par` (lesser ++ x:greater)
where lesser = parSort [y | y <- xs, y < x]
greater = parSort [y | y <- xs, y >= x]
parSort _ = []
编译并运行:ghc -O2 -threaded --make Main.hs && time ./Main +RTS -N8
有趣的是,我的变体比书籍快一点:
sorting code 1 - avg. 16 seconds
sorting code 2 - avg. 14 seconds
我想问你为什么我们可以观察到这样的行为,以及这本书的解决方案是否比我的更有好处。我很想深入了解为什么这个解决方案可以表现得更好。