{-# LANGUAGE BangPatterns #-} import Criterion.Main import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import qualified Crypto.Hash.MD5 as MD5 md5F = ( "MD5" , MD5.hash , MD5.finalize . MD5.update MD5.init ) 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]) let (fname, fHash, fIncr) = md5F let benchName ty z = fname ++ "." ++ ty -- ++ " " ++ show z defaultMain [ bgroup "hash-0b" [ bench (benchName "hash" 0) $ whnf fHash B.empty , bench (benchName "incr" 0) $ whnf fIncr B.empty ] , bgroup "hash-32b" [ bench (benchName "hash" 32) $ whnf fHash bs32 , bench (benchName "incr" 32) $ whnf fIncr bs32 ] , bgroup "hash-256b" [ bench (benchName "hash" 256) $ whnf fHash bs256 , bench (benchName "incr" 256) $ whnf fIncr bs256 ] , bgroup "hash-4Kb" [ bench (benchName "hash" 4096) $ whnf fHash bs4096 , bench (benchName "incr" 4096) $ whnf fIncr bs4096 ] ]