module Main where import qualified Criterion.Main as Criterion import Data.List (sort, sortBy, unfoldr) import System.Random import qualified Data.IntMinMaxQueue as IPQ import qualified Data.MinMaxQueue as PQ import qualified SeqQueue as SQ bench :: [Criterion.Benchmark] bench = [ Criterion.bench "intpq-asc-min" $ Criterion.nf (unfoldr IPQ.pollMin) (IPQ.fromListWith id ascElems) , Criterion.bench "intpq-desc-max" $ Criterion.nf (unfoldr IPQ.pollMax) (IPQ.fromListWith id descElems) , Criterion.bench "intpq-rand-min" $ Criterion.nf (unfoldr IPQ.pollMin) (IPQ.fromListWith id randomElems) , Criterion.bench "intpq-rand-max" $ Criterion.nf (unfoldr IPQ.pollMax) (IPQ.fromListWith id randomElems) , Criterion.bench "pq-asc-min" $ Criterion.nf (unfoldr PQ.pollMin) (PQ.fromListWith id ascElems) , Criterion.bench "pq-desc-max" $ Criterion.nf (unfoldr PQ.pollMax) (PQ.fromListWith id descElems) , Criterion.bench "pq-rand-min" $ Criterion.nf (unfoldr PQ.pollMin) (PQ.fromListWith id randomElems) , Criterion.bench "pq-rand-max" $ Criterion.nf (unfoldr PQ.pollMax) (PQ.fromListWith id randomElems) , Criterion.bench "sq-asc-min" $ Criterion.nf (unfoldr SQ.pollMin) (SQ.fromList ascElems) , Criterion.bench "sq-rand-min" $ Criterion.nf (unfoldr SQ.pollMin) (SQ.fromList randomElems) ] main :: IO () main = Criterion.defaultMain bench numElems :: Int numElems = 200000 gen :: StdGen gen = mkStdGen 42 randomElems :: [Int] randomElems = take numElems (randoms gen) ascElems :: [Int] ascElems = sort randomElems descElems :: [Int] descElems = sortBy (flip compare) randomElems