[GHC] #12817: Degraded performance with constraint synonyms

GHC ghc-devs at haskell.org
Tue Nov 8 21:17:38 UTC 2016


#12817: Degraded performance with constraint synonyms
-------------------------------------+-------------------------------------
           Reporter:  crockeea       |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           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:
-------------------------------------+-------------------------------------
 The attached bug demonstrates how using constraint synonyms can negatively
 impact performance.

 I have two functions which are identical, except that one uses a
 constraint synonym:

 {{{
 type CElt r = (Num r, Eq r)

 fooSlow :: (CElt r) => Bar r -> Bar r
 {-# INLINABLE fooSlow #-}
 fooSlow (C1 u) = either (fromEitherBar . eitherFoo) (fromEitherBar .
 eitherFoo) u
 fooSlow (C2 c) = C2 $ fooSlow c

 fooFast :: (Num r, Eq r) => Bar r -> Bar r
 {-# INLINABLE fooFast #-}
 fooFast (C1 u) = either (fromEitherBar . eitherFoo) (fromEitherBar .
 eitherFoo) u
 fooFast (C2 c) = C2 $ fooFast c
 }}}

 Using criterion, `fooSlow` is about 3x slower than `fooFast`. Main.hs
 needs `criterion` and `deepseq`, but the problem should be evident just
 from inspecting the core of Bar.hs, which only relies on `base`. Code was
 compiled with GHC-8.0.1 with `-O2`.

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


More information about the ghc-tickets mailing list