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

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/48cf0ffa4e70ba4e8f3ce7d434b7bce4918890ca

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

commit 48cf0ffa4e70ba4e8f3ce7d434b7bce4918890ca
Author: Ryan Newton <[email protected]>
Date:   Fri Jun 24 22:44:54 2011 -0400

    Adding a DEVLOG file to keep track of development.

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

 DEVLOG.md |   92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/DEVLOG.md b/DEVLOG.md
new file mode 100644
index 0000000..c56de58
--- /dev/null
+++ b/DEVLOG.md
@@ -0,0 +1,92 @@
+
+
+DEVLOG: A collection of notes accumulated during development.
+=============================================================
+
+
+[2011.06.24] (transient) Regression in stdGen performance.
+----------------------------------------------------------
+
+I just added a simple benchmark to make sure that whatever fix I
+introduce for trac ticket #5133 does not regress performance.  Yet in
+doing so I discovered that I'm getting much worse performance out of
+rev 130e421e912d than I'm seeing in my installed random-1.0.0.3 package.
+
+Current version:
+    How many random numbers can we generate in a second on one thread?
+      Cost of rdtsc (ffi call):    100
+      Approx getCPUTime calls per second: 234,553
+      Approx clock frequency:  3,335,220,196
+      First, timing with System.Random interface:
+        68,550,189 random ints generated [constant zero gen]         ~ 48.65 
cycles/int
+           900,889 random ints generated [System.Random stdGen]      ~ 3,702 
cycles/int
+
+random-1.0.0.3 version:
+    How many random numbers can we generate in a second on one thread?
+      Cost of rdtsc (ffi call):    75
+      Approx getCPUTime calls per second: 215,332
+      Approx clock frequency:  3,334,964,738
+      First, timing with System.Random interface:
+        71,683,748 random ints generated [constant zero gen]         ~ 46.52 
cycles/int
+        13,609,559 random ints generated [System.Random stdGen]      ~ 245 
cycles/int
+
+A >13X difference!! 
+Both are compiled with the same options.  The only difference is which
+System.Random is used.
+
+When did the regression occur?  
+
+ * e059ed15172585310f9c -- 10/13/2010 perf still good
+ * 6c43f80f48178ac617   -- SplittableGen introduced, still good perf
+ * 130e421e912d394653a4 -- most recent, bad performance
+
+Ok... this is very odd.  It was a heisenbug becuase it's disappeared
+now!  I'll leave this note here to help remember to look for it in the
+future.
+  -Ryan
+
+
+[2011.06.24] Timing non-int types
+---------------------------------
+
+The results are highly uneven:
+
+    Cost of rdtsc (ffi call):    84
+    Approx getCPUTime calls per second: 220,674
+    Approx clock frequency:  3,336,127,273
+    First, timing with System.Random interface:
+      112,976,933 randoms generated [constant zero gen]         ~ 29.53 
cycles/int
+       14,415,176 randoms generated [System.Random stdGen]      ~ 231 
cycles/int
+          70,751 randoms generated [System.Random Floats]      ~ 47,153 
cycles/int
+          70,685 randoms generated [System.Random CFloats]     ~ 47,197 
cycles/int
+       2,511,635 randoms generated [System.Random Doubles]     ~ 1,328 
cycles/int
+          70,494 randoms generated [System.Random CDoubles]    ~ 47,325 
cycles/int
+         858,012 randoms generated [System.Random Integers]    ~ 3,888 
cycles/int
+       4,756,213 randoms generated [System.Random Bools]       ~ 701 cycles/int
+
+As you can see, all the types that use the generic randomIvalFrac /
+randomFrac definitions perform badly.  What's more, the above results
+INCLUDE an attempt to inline:
+
+    {-# INLINE randomIvalFrac #-}
+    {-# INLINE randomFrac #-}
+    {-# INLINE randomIvalDouble #-}
+
+After reimplementing random/Float these are the new results:
+
+  Cost of rdtsc (ffi call):    100
+  Approx getCPUTime calls per second: 200,582
+  Approx clock frequency:  3,334,891,942
+  First, timing with System.Random interface:
+    105,266,949 randoms generated [constant zero gen]         ~ 31.68 
cycles/int
+     13,593,392 randoms generated [System.Random stdGen]      ~ 245 cycles/int
+     10,962,597 randoms generated [System.Random Floats]      ~ 304 cycles/int
+     11,926,573 randoms generated [System.Random CFloats]     ~ 280 cycles/int
+      2,421,520 randoms generated [System.Random Doubles]     ~ 1,377 
cycles/int
+      2,535,087 randoms generated [System.Random CDoubles]    ~ 1,315 
cycles/int
+        856,276 randoms generated [System.Random Integers]    ~ 3,895 
cycles/int
+      4,976,373 randoms generated [System.Random Bools]       ~ 670 cycles/int
+
+(But I still need to propagate these changes throughout all types / API calls.)
+
+



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

Reply via email to