[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