1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
{-# LANGUAGE DeriveGeneric, StandaloneDeriving, BangPatterns #-}
module Main where
import qualified Data.ByteString.Lazy as L
import Cabal24 (PackageDescription)
import Criterion.Main
import qualified Data.Binary as Binary
import Data.Binary.Get (Get)
import qualified Data.Binary.Get as Binary
import GenericsBenchCache
main :: IO ()
main = benchmark =<< readPackageDescriptionCache 100
benchmark :: [PackageDescription] -> IO ()
benchmark pds = do
let lbs = encode pds
!_ = L.length lbs
str = show pds
!_ = length str
defaultMain [
bench "encode" (nf encode pds)
, bench "decode" (nf decode lbs)
, bench "decode null" (nf decodeNull lbs)
, bgroup "embarrassment" [
bench "read" (nf readPackageDescription str)
, bench "show" (nf show pds)
]
]
encode :: [PackageDescription] -> L.ByteString
encode = Binary.encode
decode :: L.ByteString -> Int
decode = length . (Binary.decode :: L.ByteString -> [PackageDescription])
decodeNull :: L.ByteString -> ()
decodeNull =
Binary.runGet $ do
n <- Binary.get :: Get Int
go n
where
go 0 = return ()
go i = do
x <- Binary.get :: Get PackageDescription
x `seq` go (i-1)
readPackageDescription :: String -> Int
readPackageDescription = length . (read :: String -> [PackageDescription])
|