GHC Performance Regression

Some time ago I wrote a little test program for random number generation. Under 7.8.3 I get
Total time 9.03s ( 9.15s elapsed)
Under 7.10.3 I get
Total time 24.773s ( 25.288s elapsed)
Now of course it could be the libraries that I am using rather than GHC itself so I have tried to make them as similar as possible. For 7.8.3 I have
build-depends: base ==4.7.0.1, mtl ==2.1.3.1, primitive == 0.6, mwc-random == 0.13.3.2, vector == 0.10.12.3, random ==1.1, random-fu == 0.2.6.2, random-source == 0.3.0.6
For 7.10.3 I have
build-depends: base ==4.8.2.0, mtl ==2.2, primitive == 0.6, mwc-random == 0.13.3.2, vector == 0.10.12.3, random ==1.1, random-fu == 0.2.6.2, random-source == 0.3.0.6
So the only differences are in mtl and base. I don’t seem to be able to coax cabal into using mtl-2.2 for 7.8.3 with all the other required libraries.
dominic@ghcPerformance:~$ cabal install 'random-source ==0.3.0.6' 'random-fu ==0.2.6.2' 'random ==1.1' 'primitive ==0.6' 'mwc-random ==0.13.3.2' 'mtl ==2.2' 'vector ==0.10.12.3' --with-ghc=ghc-7.10.3 Resolving dependencies... All the requested packages are already installed: mtl-2.2 mwc-random-0.13.3.2 primitive-0.6 random-1.1 random-fu-0.2.6.2 random-source-0.3.0.6 vector-0.10.12.3 Use --reinstall if you want to reinstall anyway. dominic@ghcPerformance:~$ cabal install 'random-source ==0.3.0.6' 'random-fu ==0.2.6.2' 'random ==1.1' 'primitive ==0.6' 'mwc-random ==0.13.3.2' 'mtl ==2.2' 'vector ==0.10.12.3' --with-ghc=ghc-7.8.3 Resolving dependencies... cabal: Could not resolve dependencies: trying: random-source-0.3.0.6/installed-70e... (user goal) next goal: mtl (user goal) rejecting: mtl-2.2.1, 2.2.0.1 (global constraint requires ==2.2) rejecting: mtl-2.2/installed-cc5..., 2.2 (conflict: random-source => mtl==2.1.3.1/installed-8bc...) rejecting: mtl-2.1.3.1/installed-8bc..., 2.1.3.1, 2.1.2, 2.1.1, 2.1, 2.0.1.1, 2.0.1.0, 2.0.0.0, 1.1.1.1, 1.1.1.0, 1.1.0.2, 1.1.0.1, 1.1.0.0, 1.0 (global constraint requires ==2.2) Backjump limit reached (change with --max-backjumps).
Cabal seems to be telling me that random-source-0.3.0.6 is the problem but if I look at the constraints for that package here https://hackage.haskell.org/package/random-source https://hackage.haskell.org/package/random-source then I see
mtl https://hackage.haskell.org/package/mtl (>=1 && <3)
I am not sure how to proceed from here. Should I raise an issue on the GHC bug tracker? I’d like to solve this myself but I don’t want to start building versions of ghc to see which change caused the regression without first eliminating mtl. Any ideas would be gratefully received. Dominic Steinitz dominic@steinitz.org http://idontgetoutmuch.wordpress.com
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE FlexibleInstances #-}
import Data.Random import Data.Random.Source import qualified System.Random.MWC as MWC import Control.Monad.Reader import Control.Monad.Primitive
$(monadRandom [d| instance (PrimMonad m, s ~ PrimState m) => MonadRandom (ReaderT (MWC.Gen s) m) where getRandomWord16 = ask >>= lift . MWC.uniform getRandomWord32 = ask >>= lift . MWC.uniform getRandomWord64 = ask >>= lift . MWC.uniform |])
testUniform :: MonadRandom m => Int -> m [Double] testUniform n = replicateM (fromIntegral n) (sample stdUniform)
n :: Int n = 10^7
main :: IO () main = do seed <- MWC.create xs <- runReaderT (testUniform n) seed print (sum xs / fromIntegral n)
This cabal file will build this on 7.8.3
name: PerfTest8 version: 0.1.0.0 homepage: TBD license: MIT author: Dominic Steinitz maintainer: idontgetoutmuch@gmail.com category: System build-type: Simple cabal-version: >=1.10
executable Random8 main-is: TestMwcViaRandomSource.hs build-depends: base ==4.7.0.1, mtl ==2.1.3.1, primitive == 0.6, mwc-random == 0.13.3.2, vector == 0.10.12.3, random ==1.1, random-fu == 0.2.6.2, random-source == 0.3.0.6 default-language: Haskell2010
This cabal file will build this on 7.10.3
name: PerfTest10 version: 0.1.0.0 homepage: TBD license: MIT author: Dominic Steinitz maintainer: idontgetoutmuch@gmail.com category: System build-type: Simple cabal-version: >=1.10
executable Random10 main-is: TestMwcViaRandomSource.hs build-depends: base ==4.8.2.0, mtl ==2.2, primitive == 0.6, mwc-random == 0.13.3.2, vector == 0.10.12.3, random ==1.1, random-fu == 0.2.6.2, random-source == 0.3.0.6 default-language: Haskell2010
participants (1)
-
Dominic Steinitz