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

Reply via email to