[GHC] #14208: Performance with O0 is much better than the default or with -O2, runghc performs the best

GHC ghc-devs at haskell.org
Wed Sep 20 10:00:13 UTC 2017


#14208: Performance with O0 is much better than the default or with -O2, runghc
performs the best
-------------------------------------+-------------------------------------
        Reporter:  harendra          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      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 harendra):

 It seems, in my repo the cabal file is building the library without any
 optimization flag and in the different benchmark runs the flag is being
 changed only on the benchmark module and not on the library. So there is a
 mixup of optimization flags. Here is the new matrix taking that into
 account:

 {{{
 Main.hs       List.hs               INLINE   Default
 ----------------------------------------------------
              Identical Flags
 ----------------------------------------------------

 -O1               -O1               4.6 ms  14.2 ms
 -O0               -O0               14.2 ms 14.2 ms
 -fno-pre-inlining -fno-pre-inlining 4.6 ms  9.9 ms

 ----------------------------------------------------
              Mixed Flags
 ----------------------------------------------------

 -fno-pre-inlining -O1               4.6 ms  8.8 ms
 -O0               -O1               8.8 ms  8.8 ms

 ----------------------------------------------------
              runghc
 ----------------------------------------------------

 runghc           -O0                5.2 ms  5.2 ms
 runghc           -O1                4.7 ms  4.7 ms
 }}}

 Observations:

 1. When `toList` is INLINEd the results are more or less expected. Simon,
 what you are seeing is the INLINE column with identical flags.
 2. In the default case (no pragmas are used) `-fno-pre-inlining` does
 better than `-O1` and runghc seems to be doing well irrespective of the
 flag used to build the library (i.e. List.hs). Does it mean that `-O1` can
 also do better in this case?
 3. Mixing up the optimization flags brings one more variable in the
 picture. I would like to ignore those cases. What does GHC recommend? If
 this is not recommended, is there a way to warn the user when the flags
 are mixed up? If not, will it be possible to implement something like
 that?
 4. In my original package I am still seeing `-O0` as well as `runghc`
 doing much better than `-O2`, even when using INLINE pragmas and identical
 optimization options for all code. I guess, I need to work again to get a
 simplified example keeping these in mind.

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


More information about the ghc-tickets mailing list