
#11365: Worse performance with -O -------------------------------------+------------------------------------- Reporter: | Owner: facundo.dominguez | Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: Keywords: optimization | Operating System: Unknown/Multiple performance concurrency | Architecture: | Type of failure: Runtime Unknown/Multiple | performance bug Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- The running time of the following program worsens when compiled with {{{-O}}}, and worsens more when compiled with ghc-7.10.2. {{{ #!haskell -- /opt/ghc-7.8.3/bin/ghc --make -threaded -fforce-recomp test.hs -- time ./test: 3 seconds -- -- /opt/ghc-7.8.3/bin/ghc --make -threaded -O -fforce-recomp test.hs -- time ./test: 11 seconds -- -- /opt/ghc-7.10.2/bin/ghc --make -threaded -fforce-recomp test.hs -- time ./test: 5 seconds -- -- /opt/ghc-7.10.2/bin/ghc --make -threaded -O -fforce-recomp test.hs -- time ./test: 13 seconds -- import Control.Concurrent import Control.Monad import Data.List main :: IO () main = do let x = foldl' (+) 0 [1 .. 100000000] mv <- newEmptyMVar replicateM_ 4 $ forkIO $ putMVar mv $! x nums <- replicateM 4 $ takeMVar mv print (nums :: [Integer]) }}} The following variant which doesn't share {{{x}}} improves with {{{-O}}} for ghc-7.10.2, but ghc-7.8.3 still produces a faster program. {{{ #!haskell -- /opt/ghc-7.8.3/bin/ghc --make -threaded -fforce-recomp test.hs -- time ./test: 10 seconds -- -- /opt/ghc-7.8.3/bin/ghc --make -threaded -O -fforce-recomp test.hs -- time ./test: 11 seconds -- -- /opt/ghc-7.10.2/bin/ghc --make -threaded -fforce-recomp test.hs -- time ./test: 18 seconds -- -- /opt/ghc-7.10.2/bin/ghc --make -threaded -O -fforce-recomp test.hs -- time ./test: 15 seconds -- import Control.Concurrent import Control.Monad import Data.IORef import Data.List main :: IO () main = do mv <- newEmptyMVar ref <- newIORef 0 replicateM_ 4 $ forkIO $ do i <- readIORef ref putMVar mv $! foldl' (+) i [1 .. 100000000] nums <- replicateM 4 $ takeMVar mv print (nums :: [Integer]) }}} Some related discussion [https://mail.haskell.org/pipermail/ghc- devs/2016-January/010904.html here]. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11365 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler