Re: [GHC] #7561: Unnecessary Heap Allocations - Slow Performance

#7561: Unnecessary Heap Allocations - Slow Performance -------------------------------+-------------------------------------------- Reporter: wurmli | Owner: Type: bug | Status: new Priority: normal | Milestone: 7.8.1 Component: Compiler | Version: 7.6.1 Keywords: | Os: Linux Architecture: x86_64 (amd64) | Failure: Runtime performance bug Difficulty: Unknown | Testcase: Blockedby: | Blocking: Related: | -------------------------------+-------------------------------------------- Changes (by shachaf): * cc: shachaf@… (added) Comment: For (1), I narrowed the bug down a bit -- it has nothing to do with Vector in particular. Here's a somewhat simpler version: {{{ import Control.Applicative import Control.Monad import Control.Monad.ST import Data.STRef import System.Environment doLoop :: Int -> STRef s Int -> ST s () doLoop n v = go ((< n) <$> readSTRef v) where go mbool = do t <- mbool when t $ modifySTRef v (+1) >> go mbool main :: IO () main = do n <- read.head <$> getArgs print $ runST $ do { r <- newSTRef 0; doLoop n r; readSTRef r } }}} If you have a look at the Core for this program under normal -O2, you'll see that instead of sharing `n`, the `read` call from `main` is being moved all the way into the inner loop! This explains the significant slowdown. The code can probably be simplified further, but as it is even small changes to the program are enough to make the problem go away -- e.g. adding an SCC annotation in almost any part of `doLoop`, or evaluating `n` before passing it in, or shuffling code around too much. I haven't looked into (2). Either it's the same problem or one of these should be split out into a different ticket, presumably. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7561#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC