[Haskell-cafe] Optimizing hash array mapped tries

Don Stewart dons at galois.com
Wed Feb 24 16:13:18 EST 2010


ezyang:
> Hey guys, an update!
> 
> It turns out, Clojure is using mutation under the hood during its
> initial data structure generation to make populating the hash-map
> blazingly fast.  When I force it to use the purely functional
> interface, the performance is much closer to Haskell's.
> 
>             Haskell     Clojure
>     128K    0.56s       0.33s
>     256K    1.20s       0.84s
>     512K    2.62s       2.80s
> 
> There's a large amount of variance in the Java samples, as HotSpot
> kicks in; they appear to start off with identical performance and
> then the Clojure implementation steadily performs better as the JVM
> optimizes away.
> 
> I'd be really curious about techniques that permit mutation during
> the construction of functional datastructures; this seems like a cool
> way to get fast performance w/o giving up any of the benefits of
> immutability.  Unfortunately, my (admittedly short) experiments in
> this domain ran up against the difficulty that vector didn't let me
> unsafely freeze its mutable version. :-)

Almost all the vector library generators fill a vector destructively,
before doing an unsafeFreeze.

Here's an example of filling a buffer with randoms,

   random g n = do
    v  <- GM.new n
    fill v 0
    G.unsafeFreeze v
      where
        fill v i
            | i < n = do
                x <- R.random g
                GM.unsafeWrite v i x
                fill v (i+1)
            | otherwise = return ()
     


More information about the Haskell-Cafe mailing list