packages feed

cryptohash-0.8.0: Bench/BenchAPI.hs

{-# LANGUAGE BangPatterns #-}
import Criterion.Main
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Crypto.Hash.SHA1 as SHA1
import qualified Crypto.Hash.SHA3 as SHA3
import Crypto.Hash
import qualified Crypto.Classes as CAPI

main = do
    let !bs32     = B.replicate 32 0
        !bs256    = B.replicate 256 0
        !bs4096   = B.replicate 4096 0
        !bs1M     = B.replicate (1*1024*1024) 0
    let !lbs64x256 = (map (const (B.replicate 64 0)) [0..3])
        !lbs64x4096 = (map (const (B.replicate 64 0)) [0..63])
    defaultMain
        [ bcompare
            [ bench "sha1.hash 32" $ whnf SHA1.hash bs32
            , bench "sha1.incr 32" $ whnf (SHA1.finalize . SHA1.update SHA1.init) bs32
            , bench "sha1.api 32"  $ whnf (digestToByteString . hashsha1) bs32
            , bench "sha1.capi 32" $ whnf (CAPI.hash' :: B.ByteString -> SHA1.SHA1) bs32
            ]
        , bcompare
            [ bench "sha1.hash 256" $ whnf SHA1.hash bs256
            , bench "sha1.incr 256" $ whnf (SHA1.finalize . SHA1.update SHA1.init) bs256
            , bench "sha1.api 256"  $ whnf (digestToByteString . hashsha1) bs256
            , bench "sha1.capi 256" $ whnf (CAPI.hash' :: B.ByteString -> SHA1.SHA1) bs256
            ]
        , bcompare
            [ bench "sha1.hash 4096" $ whnf SHA1.hash bs4096
            , bench "sha1.incr 4096" $ whnf (SHA1.finalize . SHA1.update SHA1.init) bs4096
            , bench "sha1.api 4096"  $ whnf (digestToByteString . hashsha1) bs4096
            , bench "sha1.capi 4096" $ whnf (CAPI.hash' :: B.ByteString -> SHA1.SHA1) bs4096
            ]
        ]
    where hashsha1 = hash :: B.ByteString -> Digest SHA1