[Haskell-cafe] GHC Performance Regression
Dominic Steinitz
dominic at steinitz.org
Fri Mar 18 16:43:22 UTC 2016
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 at 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 at 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 at 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 at 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 at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160318/a3741a25/attachment.html>
More information about the Haskell-Cafe
mailing list