
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

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

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
participants (2)
-
Bertram Felgenhauer
-
dons@cse.unsw.edu.au