[GHC] #11196: TypeInType performance regressions

GHC ghc-devs at haskell.org
Sat Mar 19 20:42:04 UTC 2016


#11196: TypeInType performance regressions
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                Owner:
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.0.1
       Component:  Compiler          |              Version:  7.11
      Resolution:                    |             Keywords:  TypeInType
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by goldfire):

 * owner:  goldfire =>


Comment:

 I'm afraid I have to declare defeat against this ticket. :(

 I've spent the better part of the last few days trying to understand
 what's going on here, but failed utterly. I simply cannot find the source
 of the slowdown. It just seems like ''everything'' is doing more
 allocation, making it rather hard to find a culprit. I tried putting SCCs
 on low-level functions, too, but to no avail. The one moment of glory was
 finding that `tcMatchTys` was taking up 25% of the allocations on T9872c.
 I identified that the cause was a check to make sure that we don't match
 with a local, forall-bound variable. Of course, local forall-bound
 variables are rare, so I optimized the check by seeing if there are any
 forall-bound variables. This led to a whopping improvement of 20%! But
 then, inexplicably, when I turn off profiling, the exact same optimization
 led to no improvement.

 My tinkering led to a few tiny optimizations, leading to 5% reduction in
 two test cases. This is a small victory, but doesn't really undo the sting
 of defeat. (Optimizations to land in the next day or so.)

 My best guess is that the extra variables due to runtime polymorphism are
 what's gumming up the works. Previously, every binder without a type
 signature (including all local ones) were given a type `alpha ::
 OpenKind`. Now, every binder is given `alpha :: TYPE rho`; two
 metavariables where there was once one. And even when the type is solved,
 the kind now takes up more space than it did previously. But I have no
 data to back this up.

 I'm very happy to advise someone who wants to take this on. As usual with
 performance problems, the devil is in the data collecting and pinpointing
 -- the fix (if there is one) is usually quite easy. But I'm sad to say
 that I'm formally giving up on this one. I have simply timed out if I am
 to graduate.

 I will say that I don't believe this ticket needs to be a release blocker.
  * T5631 still is worse by 30% in bytes allocated. This is a happy-
 generated file with lots of mutually-recursive functions with no type
 signatures, exactly the pathological case for representation polymorphism.
 I doubt we can bring this one back to 7.10 levels.
  * T5837 is off from before `TypeInType`. But it's still better than 7.10
 was!
  * T9675 has regressed in peak memory usage, but not allocations. This one
 doesn't seem to be representation polymorphism. But I couldn't nail it.
  * T9872 is an utter abuse of type families and looks nothing like a
 typical Haskell program.

 And those are the only cases that are worse than before `TypeInType`. Work
 between when this ticket was posted and now cleared up the others. I'll
 leave it to someone else to agree with me that this needn't be a release
 blocker before changing the priority.

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


More information about the ghc-tickets mailing list