[GHC] #6166: Performance regression in mwc-random since 7.0.x
GHC
ghc-devs at haskell.org
Tue Sep 17 18:07:43 CEST 2013
#6166: Performance regression in mwc-random since 7.0.x
--------------------------------------------+------------------------------
Reporter: bos | Owner:
Type: bug | Status: new
Priority: high | Milestone: 7.6.2
Component: Compiler | Version: 7.4.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: x86_64
Type of failure: Runtime performance bug | (amd64)
Test Case: | Difficulty: Unknown
Blocking: | Blocked By:
| Related Tickets:
--------------------------------------------+------------------------------
Comment (by Khudyakov):
I've slightly simplified test case. I've tried to replace call to uniform
with mock function but to avail. It's certainly possible to add only
relevant parts of mwc-random. Only small part is actually used
Test case is slow (~100x) version of program. It's quite fragile. Small
changes can return program to normal performance. Known methods: replace
definition of `f` with constant (marked as fast), float `blocks` to the
top level.
{{{
{-# LANGUAGE BangPatterns #-}
import qualified Data.Vector.Unboxed as I
import Data.Vector.Unboxed ((!))
import Data.Word
import Data.Bits
import Control.Monad
import System.Random.MWC
main :: IO ()
main = do
g <- create
replicateM_ (100*1000) $ standard g
standard :: GenIO -> IO Double
{-# INLINE standard #-}
standard gen = do
ri <- uniform gen
return $! blocks ! fromIntegral ((ri :: Word32) .&. 127)
where
blocks :: I.Vector Double
blocks = I.cons r -- Removing cons
$ I.unfoldrN 130 go
$ T r f
where
go (T b g) = let !u = T h (exp (-0.5 * h * h))
h = sqrt (-2 * log (v / b + g))
in Just (h, u)
{-# NOINLINE blocks #-}
v,r,f :: Double
v = 9.91256303526217e-3
r = 3.442619855899
-- f = 2.669629083880923e-3 -- FAST
f = exp (-0.5 * r * r) -- SLOW
-- Unboxed 2-tuple
data T = T {-# UNPACK #-} !Double {-# UNPACK #-} !Double
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6166#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list