[GHC] #11029: Performance loss due to eta expansion
GHC
ghc-devs at haskell.org
Wed Oct 28 13:08:11 UTC 2015
#11029: Performance loss due to eta expansion
-------------------------------------+-------------------------------------
Reporter: NeilMitchell | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
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 NeilMitchell):
@nomeata: I confirm {{{-O1}}} has exactly the same behaviour.
As for fixes, my first thought is that eta-expansion is valuable even if
you are duplicating more than patterns, and sometimes duplicating patterns
is too much. My hypothetical solution would be:
* Make each function have multiple versions at different arities, so you'd
generate core for {{{test1/1}}} and {{{test1/2}}}. (The functions might
refer to each other, or not be generated if it didn't seem valuable, to
keep the size down.)
* Have the call site select between {{{test1/1}}} and {{{test1/2}}} based
on the number of arguments available.
* After that, you might want to change the desugarer, so that the two
functions above produce the same Core. Pattern matching on the first
argument could happen after the first argument is supplied, before the
second argument. It would be nice if the 2 argument version still went 3x
faster when used partially applied.
Trying to figure out the arity of a function at it's definition site seems
difficult, and can never be optimal for all uses.
For context, I got lead down this path starting at view patterns, which
have similar considerations but with arbitrarily expensive "patterns",
which GHC never duplicates: http://neilmitchell.blogspot.co.uk/2015/10
/viewpatterns-and-lambda-expansion.html. In Shake someone submitted a
patch to refactor and move a lambda to the left of an {{{=}}}, which
somewhat surprisingly can be much slower.
Adding a {{{oneShot}}} equivalent would be very useful, to make such
optimisations explicit and robust.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11029#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list