No units -- I generated the chart with Progression, which by default
normalises the data so the first library (here, "binary") in each
benchmark is 1.0. It can also generate absolute-time charts:
Runtime in seconds, grouped by benchmark: http://i.imgur.com/f0EOa.png
Runtime in seconds, grouped by library: http://i.imgur.com/PXW97.png
Benchmark source files attached, if you'd like to poke at them.
On Sun, Jan 23, 2011 at 17:21, Conrad Parker <[email protected]> wrote:
> On 24 January 2011 07:29, John Millikin <[email protected]> wrote:
>> Patch done and sent to the bytestring maintainers. For the interested,
>> here's the benchmark chart for binary, cereal, and
>> blaze-builder/bytestring:
>>
>> http://i.imgur.com/xw3TL.png
>
> Can has units?
>
> Conrad.
module Main where
import Control.DeepSeq
import Data.Monoid
import Criterion.Types
import Progression.Config
import Progression.Main
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.Binary.Builder as Binary
instance NFData B.ByteString
instance NFData BL.ByteString where
rnf a = rnf (BL.toChunks a)
bytes_100 :: B.ByteString
bytes_100 = B.replicate 100 0x61
build_strict :: Int -> B.ByteString
build_strict n = BL.toStrict (Binary.toLazyByteString builder) where
chunks = replicate n (Binary.fromByteString bytes_100)
builder = foldr Binary.append Binary.empty chunks
build_lazy :: Int -> BL.ByteString
build_lazy n = Binary.toLazyByteString builder where
chunks = replicate n (Binary.fromByteString bytes_100)
builder = foldr Binary.append Binary.empty chunks
build_strict_mconcat :: Int -> B.ByteString
build_strict_mconcat n = BL.toStrict (Binary.toLazyByteString builder) where
chunks = replicate n (Binary.fromByteString bytes_100)
builder = mconcat chunks
build_lazy_mconcat :: Int -> BL.ByteString
build_lazy_mconcat n = Binary.toLazyByteString builder where
chunks = replicate n (Binary.fromByteString bytes_100)
builder = mconcat chunks
benchmarks :: [Benchmark]
benchmarks =
[ bench "strict" (nf build_strict 1000)
, bench "strict +mconcat" (nf build_strict_mconcat 1000)
, bench "lazy" (nf build_lazy 1000)
, bench "lazy +mconcat" (nf build_lazy_mconcat 1000)
]
main :: IO ()
main = defaultMainWith config (bgroup "all" benchmarks)
config = Config
{ cfgMode = Nothing
, cfgRun = RunSettings [] (Just "01_binary")
, cfgGraph = mempty
}
module Main where
import Control.DeepSeq
import Data.Monoid
import Criterion.Types
import Progression.Config
import Progression.Main
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Blaze.ByteString.Builder as Blaze
import qualified Blaze.ByteString.Builder.Internal.Types as Blaze
instance NFData B.ByteString
instance NFData BL.ByteString where
rnf a = rnf (BL.toChunks a)
bytes_100 :: B.ByteString
bytes_100 = B.replicate 100 0x61
builderEmpty :: Blaze.Builder
builderEmpty = Blaze.Builder id
{-# INLINE builderEmpty #-}
builderAppend :: Blaze.Builder -> Blaze.Builder -> Blaze.Builder
builderAppend (Blaze.Builder b1) (Blaze.Builder b2) = Blaze.Builder (b1 . b2)
{-# INLINE builderAppend #-}
builderConcat :: [Blaze.Builder] -> Blaze.Builder
builderConcat = foldr builderAppend builderEmpty
{-# INLINE builderConcat #-}
build_strict :: Int -> B.ByteString
build_strict n = Blaze.toByteString builder where
chunks = replicate n (Blaze.fromByteString bytes_100)
builder = builderConcat chunks
build_lazy :: Int -> BL.ByteString
build_lazy n = Blaze.toLazyByteString builder where
chunks = replicate n (Blaze.fromByteString bytes_100)
builder = builderConcat chunks
build_strict_mconcat :: Int -> B.ByteString
build_strict_mconcat n = Blaze.toByteString builder where
chunks = replicate n (Blaze.fromByteString bytes_100)
builder = mconcat chunks
build_lazy_mconcat :: Int -> BL.ByteString
build_lazy_mconcat n = Blaze.toLazyByteString builder where
chunks = replicate n (Blaze.fromByteString bytes_100)
builder = mconcat chunks
benchmarks :: [Benchmark]
benchmarks =
[ bench "strict" (nf build_strict 1000)
, bench "strict +mconcat" (nf build_strict_mconcat 1000)
, bench "lazy" (nf build_lazy 1000)
, bench "lazy +mconcat" (nf build_lazy_mconcat 1000)
]
main :: IO ()
main = defaultMainWith config (bgroup "all" benchmarks)
config = Config
{ cfgMode = Nothing
, cfgRun = RunSettings [] (Just "03_blaze")
, cfgGraph = mempty
}
module Main where
import Control.DeepSeq
import Data.Monoid
import Criterion.Types
import Progression.Config
import Progression.Main
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.Serialize.Builder as Cereal
instance NFData B.ByteString
instance NFData BL.ByteString where
rnf a = rnf (BL.toChunks a)
bytes_100 :: B.ByteString
bytes_100 = B.replicate 100 0x61
build_strict :: Int -> B.ByteString
build_strict n = Cereal.toByteString builder where
chunks = replicate n (Cereal.fromByteString bytes_100)
builder = foldr Cereal.append Cereal.empty chunks
build_lazy :: Int -> BL.ByteString
build_lazy n = Cereal.toLazyByteString builder where
chunks = replicate n (Cereal.fromByteString bytes_100)
builder = foldr Cereal.append Cereal.empty chunks
build_strict_mconcat :: Int -> B.ByteString
build_strict_mconcat n = Cereal.toByteString builder where
chunks = replicate n (Cereal.fromByteString bytes_100)
builder = mconcat chunks
build_lazy_mconcat :: Int -> BL.ByteString
build_lazy_mconcat n = Cereal.toLazyByteString builder where
chunks = replicate n (Cereal.fromByteString bytes_100)
builder = mconcat chunks
benchmarks :: [Benchmark]
benchmarks =
[ bench "strict" (nf build_strict 1000)
, bench "strict +mconcat" (nf build_strict_mconcat 1000)
, bench "lazy" (nf build_lazy 1000)
, bench "lazy +mconcat" (nf build_lazy_mconcat 1000)
]
main :: IO ()
main = defaultMainWith config (bgroup "all" benchmarks)
config = Config
{ cfgMode = Nothing
, cfgRun = RunSettings [] (Just "02_cereal")
, cfgGraph = mempty
}
module Main where
import Control.DeepSeq
import Data.Monoid
import Criterion.Types
import Progression.Config
import Progression.Main
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Builder as ByteString
import qualified Data.ByteString.Builder.Internal as ByteString
instance NFData B.ByteString
instance NFData BL.ByteString where
rnf a = rnf (BL.toChunks a)
bytes_100 :: B.ByteString
bytes_100 = B.replicate 100 0x61
builderEmpty :: ByteString.Builder
builderEmpty = ByteString.Builder id
{-# INLINE builderEmpty #-}
builderAppend :: ByteString.Builder -> ByteString.Builder -> ByteString.Builder
builderAppend (ByteString.Builder b1) (ByteString.Builder b2) = ByteString.Builder (b1 . b2)
{-# INLINE builderAppend #-}
builderConcat :: [ByteString.Builder] -> ByteString.Builder
builderConcat = foldr builderAppend builderEmpty
{-# INLINE builderConcat #-}
build_strict :: Int -> B.ByteString
build_strict n = ByteString.toByteString builder where
chunks = replicate n (ByteString.fromByteString bytes_100)
builder = builderConcat chunks
build_lazy :: Int -> BL.ByteString
build_lazy n = ByteString.toLazyByteString builder where
chunks = replicate n (ByteString.fromByteString bytes_100)
builder = builderConcat chunks
build_strict_mconcat :: Int -> B.ByteString
build_strict_mconcat n = ByteString.toByteString builder where
chunks = replicate n (ByteString.fromByteString bytes_100)
builder = mconcat chunks
build_lazy_mconcat :: Int -> BL.ByteString
build_lazy_mconcat n = ByteString.toLazyByteString builder where
chunks = replicate n (ByteString.fromByteString bytes_100)
builder = mconcat chunks
benchmarks :: [Benchmark]
benchmarks =
[ bench "strict" (nf build_strict 1000)
, bench "strict +mconcat" (nf build_strict_mconcat 1000)
, bench "lazy" (nf build_lazy 1000)
, bench "lazy +mconcat" (nf build_lazy_mconcat 1000)
]
main :: IO ()
main = defaultMainWith config (bgroup "all" benchmarks)
config = Config
{ cfgMode = Nothing
, cfgRun = RunSettings [] (Just "04_bytestring")
, cfgGraph = mempty
}
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe