[GHC] #8095: TypeFamilies painfully slow

GHC ghc-devs at haskell.org
Tue Jul 18 08:20:46 UTC 2017


#8095: TypeFamilies painfully slow
-------------------------------------+-------------------------------------
        Reporter:  MikeIzbicki       |                Owner:  goldfire
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.4.1
       Component:  Compiler (Type    |              Version:  7.6.3
  checker)                           |
      Resolution:                    |             Keywords:  TypeFamilies
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #5321, #11598,    |  Differential Rev(s):
  #12506                             |
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by mbieleck):

 Thanks for the response.

 Replying to [comment:36 goldfire]:
 > Using `mkUnsafeCo` should happen only from `unsafeCoerce#`. There's
 nothing unsafe going on here, yet the Core code will be littered with what
 appear to be unsafe coercions.

 I realize that. I just picked any variant of `UnivCo` to quickly test if
 this has any chance of working (and actually improving compile times). Of
 course the right thing to do is to introduce a new `UnivCoProvenance`
 specifically for this case.

 > By the way, I say "may fix" above because this approach might still
 create the coercion, only to throw it away. If we prevent the creation of
 the coercion a little earlier, we might have more luck.

 Yes, it might still create the coercion, but at least it will prevent the
 simplifier from processing it repeatedly later.

 > I don't think the simple solution here is quite the right approach that
 will continue to work in the long term.

 Who said we can't make incremental improvements? If this would be put
 behind a flag, it should not harm anyone.

 For the record, here are some timing results (using Types.hs from the
 ticket):

 {{{
 $ ./timing.sh
 GHC=inplace/bin/ghc-stage2
     N        old       omit   old_tail  omit_tail
   200   0m0.465s   0m0.404s   0m1.674s   0m0.445s
   400   0m0.695s   0m0.504s  0m10.745s   0m0.645s
   600   0m1.077s   0m0.614s  0m28.975s   0m0.985s
   800   0m1.565s   0m0.755s    timeout   0m1.446s
  1000   0m2.225s   0m1.075s    timeout   0m2.435s
  1200   0m3.167s   0m1.426s    timeout   0m3.575s
  1400   0m4.236s   0m1.705s    timeout   0m5.045s
  1600   0m5.786s   0m1.654s    timeout   0m4.775s
  1800   0m5.756s   0m1.955s    timeout   0m6.156s
  2000   0m7.215s   0m3.106s    timeout   0m9.865s
 }}}

 `old` is the default behavior, `omit` is my patch. `_tail` variants use
 the tail recursive type family.

 The reason I'm so desperate is that it greatly affects my code. I'm using
 extensible (Vinyl) records computed using some type families. For bigger
 records, GHC just runs out of memory. This patch helps.

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


More information about the ghc-tickets mailing list