Ich plaing mit parallelen Haskell Funktionen par
und pseq
und ich habe etwas interessantes entdeckt.Haskell parallele Liste Rechenleistung
Basis Meine Beispiele auf die Beispiele aus Real World Haskell ‚s Buch (Parallel programming in Haskell):
gemeinsamen Code:
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]
Sortiercode 1 (aus dem Buch):
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 _ = []
Sortiercode 2 (meine benutzerdefinierte Variante):
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 _ = []
Compile & Lauf mit: ghc -O2 -threaded --make Main.hs && time ./Main +RTS -N8
Was interessant ist, meine Variante ist ein wenig schneller als die Bücher ein:
sorting code 1 - avg. 16 seconds
sorting code 2 - avg. 14 seconds
Ich möchte frage dich, warum wir solch ein Verhalten beobachten können und ob die Lösung des Buches irgendwelche Vorteile gegenüber meinen bietet. Ich würde gerne tief verstehen, warum diese Lösung besser funktionieren könnte.