packages feed

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
        ]