{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Main
( main
) where
#if __GLASGOW_HASKELL__ > 702
#if !MIN_VERSION_bytestring(0,10,0)
import Control.DeepSeq (NFData(rnf))
#endif
import Criterion
import Criterion.Main
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64 as B64
#endif
main :: IO ()
main =
#if __GLASGOW_HASKELL__ < 704
return ()
#else
defaultMain
[ env bs $ \ ~(bs25,bs100,bs1k,bs10k,bs100k,bs1mm) ->
bgroup "encode"
[ bgroup "25"
[ bench "base64" $ whnf B64.encode bs25
]
, bgroup "100"
[ bench "base64" $ whnf B64.encode bs100
]
, bgroup "1k"
[ bench "base64" $ whnf B64.encode bs1k
]
, bgroup "10k"
[ bench "base64" $ whnf B64.encode bs10k
]
, bgroup "100k"
[ bench "base64" $ whnf B64.encode bs100k
]
, bgroup "1mm"
[ bench "base64" $ whnf B64.encode bs1mm
]
]
, env bs' $ \ ~(bs25,bs100,bs1k,bs10k,bs100k,bs1mm) ->
bgroup "decode"
[ bgroup "25"
[ bench "base64" $ whnf B64.decode bs25
]
, bgroup "100"
[ bench "base64" $ whnf B64.decode bs100
]
, bgroup "1k"
[ bench "base64" $ whnf B64.decode bs1k
]
, bgroup "10k"
[ bench "base64" $ whnf B64.decode bs10k
]
, bgroup "100k"
[ bench "base64" $ whnf B64.decode bs100k
]
, bgroup "1mm"
[ bench "base64" $ whnf B64.decode bs1mm
]
]
]
where
bss :: BS.ByteString
bss = "ab%de^ghi*"
bs = do
let !a = BS.concat $ replicate 3 bss
!b = BS.concat $ replicate 10 bss
!c = BS.concat $ replicate 100 bss
!d = BS.concat $ replicate 1000 bss
!e = BS.concat $ replicate 10000 bss
!f = BS.concat $ replicate 100000 bss
return (a,b,c,d,e,f)
bs' = do
let !a = B64.encode (BS.concat $ replicate 3 bss)
!b = B64.encode (BS.concat $ replicate 10 bss)
!c = B64.encode (BS.concat $ replicate 100 bss)
!d = B64.encode (BS.concat $ replicate 1000 bss)
!e = B64.encode (BS.concat $ replicate 10000 bss)
!f = B64.encode (BS.concat $ replicate 100000 bss)
return (a,b,c,d,e,f)
#if !MIN_VERSION_bytestring(0,10,0)
instance NFData BS.ByteString where
rnf bs = bs `seq` ()
#endif
#endif