[GHC] #14208: Performance with O0 is much better than the default or with -O2, runghc performs the best
GHC
ghc-devs at haskell.org
Tue Sep 12 16:07:28 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 MikolajKonarski):
Great job simplifying the example! Every bit of code eliminated helps GHC
hackers immensely to tackle this (which may take a while anyway,
especially given the busy time of year). Even if the contrived example
looks nonsensical and silly. There is less noise, fewer suspects and the
Core is less overwhelming.
The combination of `-fexpose-all-unfoldings` and `-fspecialise-
aggressively` is close to (or even equivalent) to putting everything in a
single module. See
https://ghc.haskell.org/trac/ghc/ticket/12463#comment:19 and other
comments in that thread. The only drawback is that GHC takes much more
memory. A hack around that (at least before 8.2.1) is to restart GHC
during compilation when it hogs too much memory (or travis_retry after
out-of-memory segfault in travis scripts).
If you see worse fusion behaviour `-O1` than `-O0`, I guess here is hope
it can be fine-tuned in that particular case or even that it's a bug. I
wonder who is hacking on the fusion machinery these days...
But in general, inlining (especially of only a subset of functions) that
makes performance worse is a fact of life, though GHC strives hard not to
_automatically_ inline in such suspect cases. I wonder, if you marked
`toList` NOINLINE and the Monoid methods INLINE, but put everything in the
same module, would you still have the bad behaviour? That would hint that
the (partial) inlining inhibits fusion and would show which combination of
inline decisions is responsible (so that GHC may be improved for that
combination or may be prevented from automatically generating such partial
inlining).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14208#comment:16>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list