[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"
http://portal.acm.org/citation.cfm?id=734156 
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"]



Thanks,

Greg Buchholz


More information about the Haskell-Cafe mailing list