dhall-1.20.0: benchmark/map/Main.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeApplications #-}
module Main where
import Criterion.Main (defaultMain, bgroup, bench, whnf, nfIO)
import qualified Criterion.Main as Criterion
import qualified Dhall.Map as Map
testData :: Integer -> Map.Map Integer Integer
testData i = foldr (\j -> Map.insert j j) mempty [1 .. i]
benchOrderedTraversal :: String -> Map.Map Integer Integer -> Criterion.Benchmark
benchOrderedTraversal dataLabel mapData =
bgroup ("Ordered Traversals: " <> dataLabel)
[ bench "traverseWithKey" $
whnf (Map.traverseWithKey (\_ i -> pure @Maybe $ i ^ i)) mapData
, bench "traverseWithKey_" $
whnf (Map.traverseWithKey_ (\_ i -> pure @Maybe (i ^ i) *> pure ())) mapData
]
benchUnorderedTraversal :: String -> Map.Map Integer Integer -> Criterion.Benchmark
benchUnorderedTraversal dataLabel mapData =
bgroup ("Unordered Traversals: " <> dataLabel)
[ bench "unorderedTraverseWithKey_" $
whnf (Map.unorderedTraverseWithKey_ (\_ i -> pure @Maybe (i ^ i) *> pure ())) mapData
]
main :: IO ()
main = do
let !smallMap = testData 10
!mediumMap = testData 1000
!largeMap = testData 100000
defaultMain
[ benchOrderedTraversal "small" smallMap
, benchUnorderedTraversal "small" smallMap
, benchOrderedTraversal "medium" mediumMap
, benchUnorderedTraversal "medium" mediumMap
, benchOrderedTraversal "large" largeMap
, benchUnorderedTraversal "large" largeMap
]