[GHC] #11707: Don't desugar large lists with build

GHC ghc-devs at haskell.org
Tue Mar 15 11:15:48 UTC 2016


#11707: Don't desugar large lists with build
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Runtime           |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 There is currently a GHC flag which controls whether `build` desugaring is
 used at all, `-fsimple-list-literals`. To roughly characterize the effect
 of `build` on allocation, I did a nofib against
 3f60ce8751c860a2bd0ddbe87429136a9d97449b run with and without `-fsimple-
 list-literals`. The major allocation changes were,
 {{{
 --------------------------------------------------------------------------------
         Program           Size    Allocs   Runtime   Elapsed  TotalMem
 --------------------------------------------------------------------------------
            ansi          +0.0%    +10.8%     0.000     0.004      0.0%
            bspt          +0.1%     +2.7%     0.004     0.004      0.0%
       cacheprof          +0.1%     +3.3%     0.181     0.181      0.0%
           eliza          -0.2%     +0.8%     0.000     0.000      0.0%
           fluid          -0.1%     +0.7%     0.004     0.004      0.0%
          fulsom          +0.0%     +0.7%     0.125     0.125    -21.4%
       integrate          +0.0%   +152.6%     0.081     0.081     +7.4%
            lift          +0.0%     +4.5%     0.000     0.000      0.0%
        nucleic2          -0.3%     +2.4%     0.024     0.024      0.0%
          parser          -0.4%     +0.6%     0.011     0.012      0.0%
         reptile          -0.0%     +0.1%     0.004     0.004      0.0%
         rewrite          +0.1%    +96.7%     0.007     0.012      0.0%
 (those tests with no change in allocations omitted)
 --------------------------------------------------------------------------------
             Min          -0.4%     -0.2%     -1.0%     -2.0%    -21.4%
             Max          +0.1%   +152.6%     +0.3%     +0.6%     +7.4%
  Geometric Mean          -0.0%     +1.9%     -0.2%     -0.2%     -0.2%
 }}}

 There are a few things to note here:

  * Allocations, if they change at all, increase without `build` fusion, as
 we would expect
  * A `fulsom` had its total memory usage dramatically reduced without
 `build` fusion; this may be worth further investigation.
  * Runtime didn't appreciably change in any case
  * Binary sizes don't change

 On the other hand, if I compile `T9961` with `-fsimple-list-literals`, I
 see a dramatic reduction in compiler allocations (from 745044392 to
 518841472, about 30%). Unfortunately it's not easy to measure the runtime
 cost of list construction with this test. I'll try to write up a simple
 `Criterion` benchmark
 to do this.

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


More information about the ghc-tickets mailing list