base16-2.0: benchmarks/Base16Bench.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE PackageImports #-}
-- Copyright (c) 2020-2026 Emily Pillmore. BSD-3-Clause; see LICENSE.
module Main (main) where
import Criterion.Main
import Data.Base16.Types (assertBase16, extractBase16)
import qualified Data.ByteString.Short as SBS
import qualified "base16" Data.ByteString.Base16 as B16
import qualified "base16" Data.ByteString.Short.Base16 as S16
import qualified "base16-bytestring" Data.ByteString.Base16 as Reference
import Data.ByteString.Random (random)
main :: IO ()
main = defaultMain [benchSize n | n <- sizes]
where
sizes = [0, 1, 15, 16, 31, 32, 63, 64, 65, 127, 128, 129,
1000, 10000, 100000, 1000000]
benchSize :: Int -> Benchmark
benchSize size = env inputs $ \ ~(raw, encoded, shortRaw, shortEncoded) ->
bgroup (show size)
[ bgroup "encode"
[ bench variant $ nf (extractBase16 . B16.encodeBase16') raw
, bench "base16-short" $ nf (extractBase16 . S16.encodeBase16') shortRaw
, bench "base16-bytestring" $ nf Reference.encode raw
]
, bgroup "decode"
[ bench (variant ++ "-typed") $ nf B16.decodeBase16 (assertBase16 encoded)
, bench (variant ++ "-checked") $ nf B16.decodeBase16Untyped encoded
, bench "base16-short-typed" $ nf S16.decodeBase16 (assertBase16 shortEncoded)
, bench "base16-short-checked" $ nf S16.decodeBase16Untyped shortEncoded
, bench "base16-bytestring" $ nf Reference.decode encoded
]
, bgroup "parse"
[ bench variant $ nf B16.parseBase16 encoded
, bench "base16-short" $ nf S16.parseBase16 shortEncoded
]
]
where
inputs = do
raw <- random (fromIntegral size)
let encoded = Reference.encode raw
pure (raw, encoded, SBS.toShort raw, SBS.toShort encoded)
variant :: String
#ifdef BASE16_SIMD
variant = "base16-simd"
#else
variant = "base16-scalar"
#endif