packages feed

min-max-pqueue-0.1.0.0: benchmark/Main.hs

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