[Haskell-cafe] OCaml list sees abysmal Language Shootout results

Greg Buchholz haskell at sleepingsquirrel.org
Tue Oct 5 14:22:25 EDT 2004

Keith Wansbrough wrote:
> I just saw this on the OCaml list (in a posting by "Rafael 'Dido' 
> Sevilla" <dido at imperium.ph> in the "Observations on OCaml vs. Haskell" 
> thread).  I can't believe that a simple "wc" implementation should be 
> 570 times slower in Haskell than OCaml - could someone investigate and 
> fix the test?

    I've been looking at the other shootout results (with the hope of
learning something about making haskell programs faster/less memory
hungry) and I couldn't quite figure out why the "Hashes, part II" test
comsumes so much memory ( http://shootout.alioth.debian.org/bench/hash2/ ). 
So I started to try heap profiling, and generated the following graphs
for the different types of profiles...

biography => http://sleepingsquirrel.org/haskell/hash2_b.ps
retainer  => http://sleepingsquirrel.org/haskell/hash2_r.ps
closure   => http://sleepingsquirrel.org/haskell/hash2_d.ps
type      => http://sleepingsquirrel.org/haskell/hash2_y.ps
cost cntr => http://sleepingsquirrel.org/haskell/hash2_c.ps

...but I have a hard time figuring out how to prevent something like
"stg_ap_3_upd_info" or "void" cells from consuming so much memory.
Anyone have pointers on how to best use the profile information?  I'm
still trying to digest "Heap Profiling for Space Efficiency"
Are there any other related papers out there?  (Of course it might be
the case that I need a FiniteMap tutorial)

Here's the code in question...

import System (getArgs)
import Data.FiniteMap

main = do
 [n] <- getArgs 
 let get fm k = lookupWithDefaultFM fm 0 k
 let keys = map (\x -> "foo_" ++ show x) [0..9999]
 let hash1 = listToFM $ zip keys [0..9999]
 let hash2 = listToFM $ zip keys (repeat 0)
 let update k fm = addToFM_C (+) fm k (get hash1 k)
 let res = foldr update hash2 (concat $ replicate (read n) keys)
 putStrLn $ unwords $ map show [get hash1 "foo_1",
                                get hash1 "foo_9999",
                                get res "foo_1",
                                get res "foo_9999"]


Greg Buchholz

More information about the Haskell-Cafe mailing list