Skip to content

Performance Regression from 7.8.3 to 7.10.3

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. 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.

{-# 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
Trac metadata
Trac field Value
Version 7.10.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information