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 then I see

 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