strict bytestring fun

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

strict bytestring fun

Donald Bruce Stewart
High performance strings on the shootout:

http://shootout.alioth.debian.org/gp4/benchmark.php?test=sumcol&lang=all

interesting alternative programs
0.5   Haskell GHC #5          1.29            90,880        270

1.0   Clean                   2.77            600           136
2.0   C gcc                   5.64            444           159
2.1   D Digital Mars #2       5.85            700           153
2.3   C++ g++ #2              6.46            848           244

Ah well, its illegally strict, but its good to know you can do it, eh?

(A lazy bytestring version has been submitted, we'll see how that runs).

-- Don
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: strict bytestring fun

Bertram Felgenhauer-2
Donald Bruce Stewart wrote:
> High performance strings on the shootout:
>
> http://shootout.alioth.debian.org/gp4/benchmark.php?test=sumcol&lang=all
>
> interesting alternative programs
> 0.5   Haskell GHC #5          1.29            90,880        270
>
> 1.0   Clean                   2.77            600           136
[snip]

> Ah well, its illegally strict, but its good to know you can do it, eh?
>
> (A lazy bytestring version has been submitted, we'll see how that runs).

Hmm, apparently it's a factor of 10 slower. Using unsafeHead and
unsafeTail in the strict bytestring version is a *very* big win.
Without that it'd be a more reasonable factor of about 2 between the
lazy and the strict bytestring versions, according to my own tests.

FWIW, the more natural

> {-# OPTIONS -O -fbang-patterns #-}
> import qualified Data.ByteString.Lazy.Char8 as B
>
> main = print . loop 0 =<< B.getContents
>
> loop !s !xs = case B.readInt xs of
>    Just (n, xs') -> loop (s+n) (B.tail xs') -- drop the newline
>    Nothing       -> s

runs slightly faster than the explicit parsing done by the current
lazy bytestring entry in my tests.

Bertram
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe
Reply | Threaded
Open this post in threaded view
|

Re: strict bytestring fun

Donald Bruce Stewart
bertram.felgenhauer:

> Donald Bruce Stewart wrote:
> > High performance strings on the shootout:
> >
> > http://shootout.alioth.debian.org/gp4/benchmark.php?test=sumcol&lang=all
> >
> > interesting alternative programs
> > 0.5   Haskell GHC #5          1.29            90,880        270
> >
> > 1.0   Clean                   2.77            600           136
> [snip]
>
> > Ah well, its illegally strict, but its good to know you can do it, eh?
> >
> > (A lazy bytestring version has been submitted, we'll see how that runs).
>
> Hmm, apparently it's a factor of 10 slower. Using unsafeHead and
> unsafeTail in the strict bytestring version is a *very* big win.
> Without that it'd be a more reasonable factor of about 2 between the
> lazy and the strict bytestring versions, according to my own tests.
>
> FWIW, the more natural
>
> > {-# OPTIONS -O -fbang-patterns #-}
> > import qualified Data.ByteString.Lazy.Char8 as B
> >
> > main = print . loop 0 =<< B.getContents
> >
> > loop !s !xs = case B.readInt xs of
> >    Just (n, xs') -> loop (s+n) (B.tail xs') -- drop the newline
> >    Nothing       -> s
>
> runs slightly faster than the explicit parsing done by the current
> lazy bytestring entry in my tests.

Ah, I didn't try that variant. Feel free to submit it if its faster
than:
    http://shootout.alioth.debian.org/gp4/benchmark.php?test=sumcol&lang=ghc&id=3

    import Data.List
    import qualified Data.ByteString.Lazy.Char8 as L

    main = print . foldl' (+) 0 . unfoldr parse =<< L.getContents

    parse !s | Just (n,t) <- L.readInt s = Just (n, L.tail t)
             | otherwise                 = Nothing


I've updated most of the other entries now, except regex-dna, nbody and
spectral-norm. Things are looking quite good.

-- Don
_______________________________________________
Haskell-Cafe mailing list
[hidden email]
http://www.haskell.org/mailman/listinfo/haskell-cafe