[GHC] #9520: Running an action twice uses much more memory than running it once

GHC ghc-devs at haskell.org
Sat Aug 30 02:05:31 UTC 2014


#9520: Running an action twice uses much more memory than running it once
-------------------------------------+-------------------------------------
              Reporter:  snoyberg    |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.8.3
            Resolution:              |         Keywords:
      Operating System:  Linux       |     Architecture:  x86_64 (amd64)
       Type of failure:  Runtime     |       Difficulty:  Unknown
  performance bug                    |       Blocked By:
             Test Case:              |  Related Tickets:
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by int-e):

 Replying to [comment:4 snoyberg]:
 Without looking at the core, {{{sinkCount}}} has the potential to become a
 large shared data structure, if the {{{loop $! cnt + 1}}} part is floated
 out like so:
 {{{
 sinkCount :: Sink i Int
 sinkCount =
     loop 0
   where
     loop cnt = let sink' = loop $! cnt + 1 in Sink (\_ -> sink') cnt
 }}}
 Then the run-time representation of {{{(\_ -> sink')}}} is a closure that
 points to the next sink, {{{sink'}}}. The first time {{{sinkCount}}} is
 used it'll produce many sinks {{{(Sink (\_ -> sink') cnt)}}} for
 increasing counts, each linking to the next.

 Ideally, {{{sinkCount}}} and {{{feed}}} should be fused, but that requires
 inlining parts of {{{sinkCount}}} which given its recursive definition is
 tricky.

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


More information about the ghc-tickets mailing list