Repository : ssh://darcs.haskell.org//srv/darcs/packages/random

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/13c12c3bd2ccf5b079c90e148a6d1e896c0c60ed

>---------------------------------------------------------------

commit 13c12c3bd2ccf5b079c90e148a6d1e896c0c60ed
Author: Ryan Newton <[email protected]>
Date:   Sun Jun 26 00:24:46 2011 -0400

    Fixed performance dent for random generating Ints.  I can't explain why it 
was slower than other types using randomBounded, but this patch circumvents the 
problem by using next directly.

>---------------------------------------------------------------

 Benchmark/SimpleRNGBench.hs |    4 ++++
 System/Random.hs            |    5 +----
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/Benchmark/SimpleRNGBench.hs b/Benchmark/SimpleRNGBench.hs
index c5d3b9e..71f55f4 100644
--- a/Benchmark/SimpleRNGBench.hs
+++ b/Benchmark/SimpleRNGBench.hs
@@ -18,6 +18,7 @@ import Control.Monad
 import Control.Exception
 
 import Data.IORef
+import Data.Word
 import Data.List hiding (last,sum)
 import Data.Int
 import Data.List.Split
@@ -226,6 +227,7 @@ main = do
 
    let 
        randInt     = random :: RandomGen g => g -> (Int,g)
+       randWord16  = random :: RandomGen g => g -> (Word16,g)
        randFloat   = random :: RandomGen g => g -> (Float,g)
        randCFloat  = random :: RandomGen g => g -> (CFloat,g)
        randDouble  = random :: RandomGen g => g -> (Double,g)
@@ -248,6 +250,7 @@ main = do
 
         putStrLn$ "\n  Second, timing System.Random.random at different types:"
         timeit th freq "System.Random Ints"     gen   randInt
+        timeit th freq "System.Random Word16"   gen   randWord16
         timeit th freq "System.Random Floats"   gen   randFloat
         timeit th freq "System.Random CFloats"  gen   randCFloat
         timeit th freq "System.Random Doubles"  gen   randDouble
@@ -257,6 +260,7 @@ main = do
 
         putStrLn$ "\n  Third, timing range-restricted System.Random.randomR:"
         timeit th freq "System.Random Ints"     gen   (randomR (-100, 
100::Int))
+        timeit th freq "System.Random Word16s"  gen   (randomR (-100, 
100::Word16))
         timeit th freq "System.Random Floats"   gen   (randomR (-100, 
100::Float))
         timeit th freq "System.Random CFloats"  gen   (randomR (-100, 
100::CFloat))
         timeit th freq "System.Random Doubles"  gen   (randomR (-100, 
100::Double))
diff --git a/System/Random.hs b/System/Random.hs
index f8a7dd7..1364b98 100644
--- a/System/Random.hs
+++ b/System/Random.hs
@@ -285,7 +285,7 @@ instance Random Integer where
   randomR ival g = randomIvalInteger ival g
   random g      = randomR (toInteger (minBound::Int), toInteger 
(maxBound::Int)) g
 
-instance Random Int        where randomR = randomIvalIntegral; random = 
randomBounded
+instance Random Int        where randomR = randomIvalIntegral; random = next
 instance Random Int8       where randomR = randomIvalIntegral; random = 
randomBounded
 instance Random Int16      where randomR = randomIvalIntegral; random = 
randomBounded
 instance Random Int32      where randomR = randomIvalIntegral; random = 
randomBounded
@@ -355,15 +355,12 @@ instance Random Float where
             rand = fromIntegral (mask24 .&. x) 
                   :: Float
         in 
---         (rand / 2^24, rng')
          (rand / fromIntegral twoto24, rng')
         -- Note, encodeFloat is another option, but I'm not seeing slightly
         --  worse performance with the following [2011.06.25]:
 --         (encodeFloat rand (-24), rng')
    where
      mask24 :: Int 
---     mask24 = 2^24 - 1
-
      mask24 = twoto24 - 1
      -- RRN: Note, in my tests [2011.06.25] this worked as well as using 
Data.Bit:
      twoto24 = (2::Int) ^ (24::Int)



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to