[Haskell-cafe] OCaml list sees abysmal Language Shootout results
Georg Martius
mai99dgf at studserv.uni-leipzig.de
Wed Sep 29 20:34:02 EDT 2004
On Wed, 29 Sep 2004 15:58:24 -0700, Greg Buchholz <haskell at sleepingsquirrel.org> wrote:
<snip>
>
> Just for the heck of it, I'd thought I'd try to write a naive 1-pass
> version of the program. It turned out to be 4.5 times slower than the
> original...
>
> -- compiled with: ghc -O2 -ddump-simpl -fvia-c -o wc_fold wc_fold.hs
>
> import IO
>
> main = do file <- getContents
> putStrLn (show (foldl wc (0,0,0) file))
>
> wc :: (Int,Int,Int) -> Char -> (Int, Int, Int)
> wc (l,w,c) '\n' = (l+1,w ,c+1)
> wc (l,w,c) ' ' = (l ,w+1,c+1)
> wc (l,w,c) x = (l ,w ,c+1)
use strictness is the trick to exploit the tail-recursion. There is possibly a better way but:
data C = C !Int !Int !Int deriving Show
wc' :: C -> Char -> C
wc' (C l w c) '\n' = C (l+1) w (c+1)
wc' (C l w c) ' ' = C l (w+1) (c+1)
wc' (C l w c) x = C l w (c+1)
is significant faster. The results on a 12MB file:
original:
1,699,541,396 bytes allocated in the heap
340,796,888 bytes copied during GC
75,415,872 bytes maximum residency (8 sample(s))
146 Mb total memory in use
Total time 5.92s ( 6.09s elapsed)
wc: (yours)
I have not enough memory :-(
wc':
535,286,872 bytes allocated in the heap
187,340,032 bytes copied during GC
135,696 bytes maximum residency (130 sample(s))
2 Mb total memory in use
Total time 2.45s ( 2.53s elapsed)
Cheers,
Georg
--
---- Georg Martius, Tel: (+49 34297) 89434 ----
------- http://www.flexman.homeip.net ---------
More information about the Haskell-Cafe
mailing list