[GHC] #14208: Performance with O0 is much better than the default or with -O2, runghc performs the best

GHC ghc-devs at haskell.org
Tue Sep 19 15:30:58 UTC 2017


#14208: Performance with O0 is much better than the default or with -O2, runghc
performs the best
-------------------------------------+-------------------------------------
        Reporter:  harendra          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      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 simonpj):

 This is odd.  I can't reproduce what you are seeing.  I get this,
 measuring allocation
 {{{
 HEAD, separate modules, but with {-# INLINABLE #-} on toList

 -O0                        496M
 -O1                        160M
 -O1 -fno-pre-inlining      312M


 HEAD, One module

 -O0                         496M
 -O1                         160M
 -O1 -fno-pre-inlining       312M


 GHC-8.2-branch, one module

 -O0                         496M
 -O1                         160M
 -O1 -fno-pre-inlining       312M
 }}}
 Here's the code I'm using (I had to add `instance Semigroup (List a)`:
 {{{
 module Main where


 import Control.Monad  (liftM)
 import Data.Semigroup (Semigroup(..))

 -- import T14208a

 -------------------------------
 data List a = Stop | Yield a (List a)

 instance Monoid (List a) where
     mempty = Stop
     mappend x y =
         case x of
             Stop -> y
             Yield a r -> Yield a (mappend r y)

 instance Semigroup (List a) where
    (<>) = mappend

 toList :: Monad m => List a -> m [a]
 toList m =
     case m of
         Stop -> return []
         Yield a r -> liftM (a :) (toList r)
 --------------------------------

 len :: IO Int
 len = do
     xs <- toList $ (foldr mappend mempty $ map (\x -> Yield x Stop)
 [1..1000000 :: Int])
     return (length xs)

 main = do { x <- len; print x }
 }}}
 With "two files" I pushed the stuff between the lines into a separate
 file.

 I did an an INLINABLE pragma for `toList`.  And I multiplied the limit
 count by 10.  I did not use Criterion (less to depend on).

 Can you say more precisely how to reproduce the problem?

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


More information about the ghc-tickets mailing list