bitvec-1.0.0.0: bench/Bench.hs
module Main where
import Control.Monad
import Control.Monad.ST
import Data.Bit
import qualified Data.Bit.ThreadSafe as TS
import Data.Bits
import qualified Data.Vector.Unboxed.Mutable as MU
import Gauge.Main
main :: IO ()
main = defaultMain
[ bgroup "randomWrite" $ map benchRandomWrite [5..10]
, bgroup "randomWriteTS" $ map benchRandomWriteTS [5..10]
]
benchRandomWrite :: Int -> Benchmark
benchRandomWrite k = bench (show (2 ^ k)) $ nf doRandomWrite k
doRandomWrite :: Int -> Int
doRandomWrite k = runST $ do
let n = 2 ^ k
ixs = scanl xor 0 [0..n-1]
vals = take 100 $ cycle [Bit True, Bit False]
vec <- MU.new n
forM_ vals $ \v -> forM_ ixs $ \i -> MU.unsafeWrite vec i v
Bit i <- MU.unsafeRead vec 0
pure $ if i then 1 else 0
benchRandomWriteTS :: Int -> Benchmark
benchRandomWriteTS k = bench (show (2 ^ k)) $ nf doRandomWriteTS k
doRandomWriteTS :: Int -> Int
doRandomWriteTS k = runST $ do
let n = 2 ^ k
ixs = scanl xor 0 [0..n-1]
vals = take 100 $ cycle [TS.Bit True, TS.Bit False]
vec <- MU.new n
forM_ vals $ \v -> forM_ ixs $ \i -> MU.unsafeWrite vec i v
TS.Bit i <- MU.unsafeRead vec 0
pure $ if i then 1 else 0