
#15176: Superclass `Monad m =>` makes program run 100 times slower -------------------------------------+------------------------------------- Reporter: danilo2 | Owner: osa1 Type: bug | Status: new Priority: highest | Milestone: 8.8.1 Component: Compiler | Version: 8.4.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 osa1): So, I've built two versions of the package with `-dump-simpl -dump-to-file -dsuppress-uniques` (which took about an hour to build twice on my i7-8700K desktop). Unfortunately there are 71 modules in this package and none of the files are identical between two versions (there are at least very minor identifier changes) so this is still not easy to debug, but while checking some random files I found some relevant changes between two versions: This expression in the original version: {{{ $dLayersFoldableBuilder__ `cast` (Data.Graph.Fold.Layer.N:LayersFoldableBuilder__[0] <t>_N <layers>_N <m>_N :: (LayersFoldableBuilder__ t layers m :: Constraint) ~R# (SomePtr -> m (Fold.Result t) -> m (Fold.Result t) :: *)) }}} becomes this after `Monad =>`: {{{ buildLayersFold__ @ t @ layers @ m $dLayersFoldableBuilder__ }}} If my understanding is correct, in the original version the typeclass dictionary is represented as its method, but with `Monad m =>` it's not as it not has one more field for the `Monad m` dictionary. This means one layer of indirection in the `Monad m =>` version. There are lots of changes similar to this. Not sure if this by itself explains 20x increase in runtime though. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15176#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler