Testowałem wydajność funkcji partition
dla list i otrzymałem pewne dziwne wyniki, jak sądzę.Filtr analizy porównawczej i partycja
Mamy tę partition p xs == (filter p xs, filter (not . p) xs)
, ale wybraliśmy pierwszą implementację, ponieważ wykonuje tylko jedno przejście na liście. Jednak wyniki, które otrzymałem, mówią, że być może lepiej byłoby użyć implementacji, która używa dwóch przejazdów.
Oto minimalny kod, który pokazuje, co widzę
import Criterion.Main
import System.Random
import Data.List (partition)
mypartition :: (a -> Bool) -> [a] -> ([a],[a])
mypartition p l = (filter p l, filter (not . p) l)
randList :: RandomGen g => g -> Integer -> [Integer]
randList gen 0 = []
randList gen n = x:xs
where
(x, gen') = random gen
xs = randList gen' (n - 1)
main = do
gen <- getStdGen
let arg10000000 = randList gen 10000000
defaultMain [
bgroup "filters -- split list in half " [
bench "partition100" $ nf (partition (>= 50)) arg10000000
, bench "mypartition100" $ nf (mypartition (>= 50)) arg10000000
]
]
Pobiegłem testy zarówno z -O
i bez niego i za każdym razem dostaję że podwójne przechodzenia przez to lepiej.
Używam ghc-7.10.3
z criterion-1.1.1.0
moje pytania są następujące:
Czy to prawidłowo?
Czy używam kryterium poprawnie? Wiem, że lenistwo może być trudne i
(filter p xs, filter (not . p) xs)
wykona tylko dwa przejazdy, jeśli użyte zostaną oba elementy krotki.Czy ma to coś wspólnego ze sposobem obsługi list w Haskell?
Wielkie dzięki!
Używasz 'kryterium' prawie całkiem poprawnie, ale powinieneś idealnie użyć' env' aby utworzyć listę losową i przekazać ją do testów porównawczych lub przynajmniej wymusić wymuszenie tej listy przed testowaniem porównawczym. – dfeuer
Ponadto, ponieważ jest to pytanie dotyczące wydajności, powinieneś poinformować nas, jakiej wersji GHC używasz. – dfeuer
Dzięki. Zmieniłem moje pytanie. Używam 'ghc-7.10.3'. Czy wiesz, czy istnieje jakikolwiek powód, dla którego te dwa ruchy są w tym przypadku szybsze? Testowałem to również przy użyciu lokalnej implementacji list, ponieważ uważałem, że może to mieć coś wspólnego z implementacją ghc, ale wyniki się nie zmieniają! – aesadde