Repository : ssh://darcs.haskell.org//srv/darcs/packages/random On branch : master
http://hackage.haskell.org/trac/ghc/changeset/dfeff473ceefcc7e8d4b202fe154e8f869f12e67 >--------------------------------------------------------------- commit dfeff473ceefcc7e8d4b202fe154e8f869f12e67 Author: Ryan Newton <[email protected]> Date: Tue Jun 28 14:25:45 2011 -0400 Adding the simple speed test from ticket #427. >--------------------------------------------------------------- tests/slowness.hs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 55 insertions(+), 0 deletions(-) diff --git a/tests/slowness.hs b/tests/slowness.hs new file mode 100644 index 0000000..162a4cf --- /dev/null +++ b/tests/slowness.hs @@ -0,0 +1,55 @@ + +-- http://hackage.haskell.org/trac/ghc/ticket/427 + +-- Two (performance) problems in one: + +{-# OPTIONS -fffi #-} +module Main (main) where + +import Control.Monad +import System.Random + +foreign import ccall unsafe "random" _crandom :: IO Int +foreign import ccall unsafe "stdlib.hs" rand :: IO Int + +randomInt :: (Int, Int) -> IO Int +randomInt (min,max) = do +-- n <- _crandom + n <- rand + return $ min + n `rem` range + where + range = max - min + 1 + +main = replicateM_ (5*10^6) $ do + x <- randomRIO (0::Int,1000) :: IO Int +-- x <- randomInt (0::Int,1000) :: IO Int + x `seq` return () + return () + +-- First, without the "seq" at the end, hardly anything is +-- evaluated and we're building huge amounts of thunks. +-- Three ideas about this one: +-- - Blame the user :) +-- - data StdGen = StdGen !Int !Int +-- Use strict fields in StdGen. Doesn't actually help +-- (at least in this example). +-- - Force evaluation of the StdGen in getStdRandom. +-- Does help in this example, but also changes behaviour +-- of the library: +-- x <- randomRIO undefined +-- currently dies only when x (or the result of a later +-- randomRIO) is evaluated. This change causes it to die +-- immediately. + +-- Second, even _with_ the "seq", replacing "randomRIO" by +-- "randomInt" speeds the thing up with a factor of about +-- 30. (2 to 3.6, in a "real world" university practicum +-- exercise of 900 lines of code) +-- Even given the fact that they're not really doing the +-- same thing, this seems rather much :( + +-------------------------------------------------------------------------------- + +-- [2011.06.28] RRN: +-- I'm currently seeing 1425 ms vs 43 ms for the above. 33X +-- difference. If I use rand() instead it's about 52ms. _______________________________________________ Cvs-libraries mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-libraries
