packages feed

linear-base-0.8.1: bench/Data/Mutable/Quicksort.hs

{-# LANGUAGE NumericUnderscores #-}

module Data.Mutable.Quicksort (benchmarks) where

import Control.DeepSeq (force)
import Control.Exception (evaluate)
import Data.List (sort)
import Simple.Quicksort (quicksortUsingArray, quicksortUsingList)
import System.Random
import Test.Tasty.Bench

-- Follows thread from https://discourse.haskell.org/t/linear-haskell-quicksort-performance/10280

gen :: StdGen
gen = mkStdGen 4541645642

randomListBuilder :: Int -> IO [Int]
randomListBuilder size = evaluate $ force $ take size (randoms gen :: [Int])

sizes :: [Int]
sizes = [1_000, 50_000, 1_000_000]

benchmarks :: Benchmark
benchmarks =
  bgroup
    "quicksort"
    ( ( \size ->
          env (randomListBuilder size) $ \randomList ->
            bgroup
              ("size " ++ (show size))
              [ bench "quicksortUsingArray" $
                  nf quicksortUsingArray randomList,
                bench "quicksortUsingList" $
                  nf quicksortUsingList randomList,
                bench "sortStdLib" $
                  nf sort randomList
              ]
      )
        <$> sizes
    )