[GHC] #12754: Adding an explicit export list halves compilation time.

GHC ghc-devs at haskell.org
Wed Oct 26 07:59:38 UTC 2016


#12754: Adding an explicit export list halves compilation time.
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 I stupidly missed Matthew's original insight in the Description.  He's
 absolutely right; the current thing is stupid.

 There should be nothing non-linear about this.  We have a `[GRE]` and we
 want a `[AvailInfo]`.  Very well: do
 {{{
 gresToAvailInfo :: [GRE] -> [AvailInfo]
 gresToAvailInfo gres
   = nameEnvElts avail_env
   where
     avail_env :: NameEnv AvailInfo   -- Keyed by the parent
     avail_env = foldr add emptyNameEnv gres

     add :: GRE -> NameEnv AvailInfo -> NameEnv AvailInfo
     add gre env = ... very like availFromGRE, but instead of returning
                       an AvailInfo, it extends the appropriate AvailInfo
                       in the env ...
 }}}
 Each GRE should take constant time to add.  Each GRE deals with a
 different Name, so there is no need to check for duplicates.

 Needed in two places

 * `TcRnExports.exports_from_avail`, the `Nothing` case.

 * Same function, the `IEModuleContents` case of `exports_from_item`

 Hmm.  The use of `nubAvails` is still needed though, in case you say
 {{{
 module M( T( D, D3 ), T( D, D2 ) )
 }}}
 when we should combine the two export items to `T( D, D2, D3 )`.  So we
 might still get the non-linear cost if you have very many manually-written
 items, which is at least better.

 So an alternative, perhaps better, would be to rewrite `nubAvails` to use
 code very like the above function, so that each `Name` in the
 `[AvailInfo]` takes linear time to add.  That's be more robust I guess.

 Finally, the other use of `nubAvails` is in `RnNames,findImportUsage`.  I
 think `extendImportMap` could return a `[GRE]` as the second element of
 its result pair, instead of `[AvailInfo]`, and then we could use
 `gresToAvailInfo` again; but this time we'd need to worry about
 duplicates.

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


More information about the ghc-tickets mailing list