[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