packages feed

stable-heap-0.2.1.0: bench/Bench.hs

import Criterion.Main

import Data.List (unfoldr)
import Data.Vector.Unboxed (Vector)
import qualified Data.Vector.Unboxed as Vector
import System.Random.MWC
import qualified Data.Foldable as Foldable
import Control.Arrow

import qualified Data.Heap.Stable as Stable
import qualified Data.PQueue.Prio.Min as PQueue
import qualified Data.PriorityQueue.FingerTree as FingerTree
import qualified Data.Heap as Heap

createGroup :: Vector (Int, ()) -> String -> (a -> [(Int, ())]) -> (a -> Int -> () -> a) -> a -> Benchmark
createGroup xs name toListAsc snoc empty =
  bench name $ whnf (sum . map fst . toListAsc . Vector.foldl' (\acc (k, v) -> snoc acc k v) empty) xs

main :: IO ()
main = do
  gen <- create
  xs <- asGenIO (`uniformVector` 1000) gen :: IO (Vector Int)
  let create = createGroup (Vector.zip xs (Vector.replicate 1000 ()))
  defaultMain
    [ bgroup "unstable"
      [ create "pqueue" PQueue.toAscList (\q k v -> PQueue.insert k v q) PQueue.empty
      , create "heap" (map (Heap.priority &&& Heap.payload) . Foldable.toList) (\h k v -> Heap.insert (Heap.Entry k v) h) Heap.empty
      ]
    , bgroup "stable"
      [ create "stable-heap" Stable.toAscList Stable.snoc Stable.empty
      , create "fingertree" (unfoldr FingerTree.minViewWithKey) (\q k v -> FingerTree.add k v q) FingerTree.empty
      ]
    ]