[Haskell-beginners] Red-black tree performance

Adrien Haxaire adrien at haxaire.org
Tue Mar 20 15:37:18 CET 2012


 Dear list,

 I had to implement a red-black tree in C++. So I took Okasaki's 
 functional pearl and ported the algorithm to C++, where the rebalancing 
 is done by following parent pointers. I shew the Haskell algorithm to 
 colleagues, and after admitting it is impressive, they told me whatever 
 the beauty as long as we have performance. So I benchmarked it and the 
 C++ implementation, insertion of one million elements, and the C++ 
 version is 15 times faster. Mainly because in C++ it is just moving 
 pointers around I guess. I have to mention that the space usage is 
 outrageous with Haskell.

 The Tree is strict in its subtrees, but I think the problem comes from 
 the laziness of the balance function, which needs to hold the whole 
 tree.

 This reduces to my main question: how can I decompose balance in a 
 stricter version? Or maybe I'm completely wrong and there is something 
 obvious I am missing?

 If you want to take a look, the code is here: http://hpaste.org/65611


 Adrien


 PS: compiler options and profiling stderr output

> ghc -Wall -O2 -prof -auto-all -rtsopts rbt.hs

> rbt.exe +RTS -K20M -p -sstderr -RTS
 1000000
      964,079,612 bytes allocated in the heap
      230,842,072 bytes copied during GC
       58,442,812 bytes maximum residency (7 sample(s))
          327,812 bytes maximum slop
              105 MB total memory in use (0 MB lost due to 
 fragmentation)

                                     Tot time (elapsed)  Avg pause  Max 
 pause
   Gen  0      1810 colls,     0 par    0.30s    0.27s     0.0001s    
 0.0034s
   Gen  1         7 colls,     0 par    0.19s    0.19s     0.0278s    
 0.0938s

   INIT    time    0.00s  (  0.00s elapsed)
   MUT     time    1.78s  (  1.82s elapsed)
   GC      time    0.48s  (  0.46s elapsed)
   RP      time    0.00s  (  0.00s elapsed)
   PROF    time    0.00s  (  0.00s elapsed)
   EXIT    time    0.00s  (  0.00s elapsed)
   Total   time    2.28s  (  2.28s elapsed)

   %GC     time      21.2%  (20.3% elapsed)

   Alloc rate    537,387,643 bytes per MUT second

   Productivity  78.8% of total user, 78.5% of total elapsed




-- 
 Adrien Haxaire
 www.adrienhaxaire.org | @adrienhaxaire



More information about the Beginners mailing list