[GHC] #14035: Weird performance results.

GHC ghc-devs at haskell.org
Fri Jul 28 21:28:15 UTC 2017


#14035: Weird performance results.
-------------------------------------+-------------------------------------
        Reporter:  danilo2           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by danilo2):

 One more important thing to note here is that the provided code was
 shortened to the limits. It does not use the `XBool` value in any place
 (it puts `-XFalse` everywhere, even after successful parse). It implies
 that the problem (2a) is also not very important - it is just an
 optimization opportunity in a very special and rare use case.

 We can easily fix the code and make it a real use case by inserting the
 following code:

 {{{#!hs
 class Monad m => ProgressMonad m where
     returnProgressed :: forall a. a -> m a

 instance {-# OVERLAPPABLE #-} (ProgressMonad m, Monad (t m), MonadTrans t)
 => ProgressMonad (t m) where
     returnProgressed = lift . returnProgressed ; {-# INLINE
 returnProgressed #-}

 instance Monad m => ProgressMonad (FailParser m) where
     returnProgressed a = failParser $ return $ Right $ T XTrue a ; {-#
 INLINE returnProgressed #-}
 }}}

 and replacing the line 125 to:

 {{{#!hs
 Just (!t, !s') -> if t == 'a' then put s' >> returnProgressed t else
 failed
 }}}

 The `XBool` value would then be used to implement `Alternative` instance,
 but we do not need it here. We can observe the same slowdown (`10^6` chars
 parsed in 15ms with `-XStrict` enabled). Which is expected, based on the
 results so far, however if we want to base on a real use case, this code
 help us transform abstract program to real one.

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


More information about the ghc-tickets mailing list