[GHC] #783: performance problem compiling large file

GHC trac at galois.com
Thu Feb 28 11:04:59 EST 2008


#783: performance problem compiling large file
------------------------------------------+---------------------------------
 Reporter:  guest                         |          Owner:          
     Type:  compile-time performance bug  |         Status:  new     
 Priority:  normal                        |      Milestone:  6.8.3   
Component:  Compiler                      |        Version:  6.4.2   
 Severity:  normal                        |     Resolution:          
 Keywords:  performance                   |     Difficulty:  Unknown 
 Testcase:                                |   Architecture:  Multiple
       Os:  Multiple                      |  
------------------------------------------+---------------------------------
Comment (by igloo):

 With a slightly simpler variant of this:
 {{{
 module Foo where

 foo :: Double -> Int
 foo x | x == 1 = 1
 foo x | x == 2 = 2
 ...
 foo x | x == 500 = 500
 }}}
 compiling with
 {{{
 ghc -c large.hs -fforce-recomp +RTS -p -h
 }}}
 one problem is that we get something like
 {{{
 lit1 = ...
 lit2 = ...
 ...

 foo = case ... of
           False ->
               case ... of
                   False -> ...
                   True -> lit2
           True -> lit1
 }}}
 Each of the case expressions has an SRT for its alternatives. The outer
 one has all 500 lit's, the one inside 499, and so on, so we have
 quadratic space usage. The SRTs are `SRTEntries cafs`, where `cafs` is an
 `IdSet` (which is ultimately a `UniqFM`), so no sharing is possible.

 In this particular case using `-O` "fixes" it as `==` etc get specialised
 and the lits disappear, but (a) this won't be the case in general and
 (b) I don't think you should need to use `-O` to get reasonable compiler
 space usage.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/783#comment:11>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list