[Haskell-cafe] Data.Binary suboptimal instance

Henning Thielemann lemming at henning-thielemann.de
Sat May 23 15:23:05 EDT 2009


Khudyakov Alexey schrieb:
> On Saturday 23 May 2009 02:55:17 Antoine Latter wrote:
>> Or you could go for the compromise position, where the list can be
>> part of a complex data structure so you're not relying on EOF to find
>> the end.
>>
> Interesting solution however it does not perform very nice. I wrote
> microbenchmark
>
>> xs :: [Word32]
>> xs = [1..(10^6)]
>
> Writing chunked list of Word32
>> B.writeFile "chunked" . toLazyByteString . putList putWord32be $ xs
> real    0m4.311s
> user    0m3.272s
> sys     0m0.096s
>
> Reading chunked list of Word32
>> print . last . runGet (getList getWord32be) =<< B.readFile "chunked"
> real    0m0.634s
> user    0m0.496s
> sys     0m0.012s
>
>
> Writing stream of Word32
>> B.writeFile "stream" . encodeStream $ xs
> real    0m0.391s
> user    0m0.252s
> sys     0m0.020s
>
> Reading stream of Word32
>> print . (last :: [Word32] -> Word32) . decodeStream =<< B.readFile "stream"
> real    0m0.376s
> user    0m0.248s
> sys     0m0.020s
>
>
> I didn'd do any profiling so I have no idea why writing is so slow.


If you use top-level definition 'xs' the program might cache the list
and second write is faster. You may change the order of tests in order
check, whether that is the cause.


More information about the Haskell-Cafe mailing list