[Haskell-cafe] Performance Issue

Richard Warburton richard.warburton at gmail.com
Tue May 18 12:30:56 EDT 2010

A colleague of mine pointed out that ghc wasn't performing as he
expected when optimising some code.  I wonder if anyone could offer
any insight as to why its not noting this common subexpression:

main = print $ newton 4 24

newton a 0 = a
newton a n =  ((newton a (n-1))^2 + a)/(2*(newton a (n-1)))

Compiled with 'ghc -O3 --make perf.hs', results in:

real    0m5.544s
user    0m5.492s
sys     0m0.008s

However if we factor out the repeated call to the newton method:

main = print $ newton2 4 24

newton2 a 0 = a
newton2 a n =  (x^2 + a)/(2*x)
          x = newton2 a (n-1)

real    0m0.004s
user    0m0.004s
sys     0m0.004s

It looks to me like Referential transparency should make this a sound
optimisation to apply, but ghc isn't doing it even on -O3.



More information about the Haskell-Cafe mailing list