Added tests and benchmarks for BIG Integers.
authorRyan Newton <rrnewton@gmail.com>
Tue, 28 Jun 2011 14:07:45 +0000 (10:07 -0400)
committerRyan Newton <rrnewton@gmail.com>
Tue, 28 Jun 2011 14:07:45 +0000 (10:07 -0400)
Benchmark/SimpleRNGBench.hs
DEVLOG.md
tests/rangeTest.hs
tests/rangeTest.stdout

index 05cfda5..114722c 100644 (file)
@@ -253,13 +253,7 @@ main = do
        randCDouble = random :: RandomGen g => g -> (CDouble,g)
        randInteger = random :: RandomGen g => g -> (Integer,g)
        randBool    = random :: RandomGen g => g -> (Bool,g)
-
-       -- rangeFloat  g = randomR (-100, 100::Float)   g
-       -- rangeCFloat  g = randomR (-100, 100::CFloat)  g
-       -- rangeDouble  g = randomR (-100, 100::Double)  g
-       -- rangeCDouble g = randomR (-100, 100::CDouble) g
-       -- rangeInteger g = randomR (-100, 100::Integer) g
-       -- rangeBool    g = randomR (False, True)        g
+       randChar    = random :: RandomGen g => g -> (Char,g)
 
        gen = mkStdGen 23852358661234
        gamut th = do
@@ -276,6 +270,7 @@ main = do
         timeit th freq "System.Random CDoubles" gen   randCDouble
         timeit th freq "System.Random Integers" gen   randInteger
         timeit th freq "System.Random Bools"    gen   randBool
+        timeit th freq "System.Random Chars"    gen   randChar
 
 #ifdef TEST_COMPETITORS
         putStrLn$ "\n  Next test other RNG packages on Hackage:"
@@ -306,6 +301,8 @@ main = do
         timeit th freq "System.Random CDoubles" gen   (randomR (-100, 100::CDouble))
         timeit th freq "System.Random Integers" gen   (randomR (-100, 100::Integer))
         timeit th freq "System.Random Bools"    gen   (randomR (False, True::Bool))
+        timeit th freq "System.Random Chars"    gen   (randomR ('a', 'z'))
+        timeit th freq "System.Random BIG Integers" gen (randomR (0, (2::Integer) ^ (5000::Int)))
 
   --       when (not$ NoC `elem` opts) $ do
   --     putStrLn$ "  Comparison to C's rand():"
index c56de58..ef235d1 100644 (file)
--- a/DEVLOG.md
+++ b/DEVLOG.md
@@ -90,3 +90,16 @@ After reimplementing random/Float these are the new results:
 (But I still need to propagate these changes throughout all types / API calls.)
 
 
+
+[2011.06.28] Integer Generation via random and randomR
+-------------------------------------------------------
+
+Back on the master branch I notice that while randomIvalInteger does
+well for small ranges, it's advantage doesn't scale to larger ranges:
+
+  range (-100,100):
+      5,105,290 randoms generated [System.Random Integers]    ~ 653 cycles/int
+
+  range (0,2^5000):
+          8,969 randoms generated [System.Random BIG Integers] ~ 371,848 cycles/int
+
index ec95e56..88f736d 100644 (file)
@@ -58,6 +58,8 @@ main =
  do 
     checkBounds "Int"     (intRange nb)  (approxBounds random trials (undefined::Int))
     checkBounds "Integer" (intRange nb)  (approxBounds random trials (undefined::Integer))
+    checkBounds "Integer Rbig"    (False,-(2^500), 2^500) (approxBounds (randomR (-(2^500), 2^500)) trials (undefined::Integer))
+    checkBounds "Integer RbigPos" (False,1,2^5000)        (approxBounds (randomR (1,2^5000))        trials (undefined::Integer))
     checkBounds "Int8"    (intRange 8)   (approxBounds random trials (undefined::Int8))
     checkBounds "Int16"   (intRange 16)  (approxBounds random trials (undefined::Int16))
     checkBounds "Int32"   (intRange 32)  (approxBounds random trials (undefined::Int32))
index 55ccaff..f9d9479 100644 (file)
@@ -1,5 +1,7 @@
 Int:  Passed
 Integer:  Passed
+Integer Rbig:  Passed
+Integer RbigPos:  Passed
 Int8:  Passed
 Int16:  Passed
 Int32:  Passed