BenchmarkPerform: add sequential, uniform and normal distribution of both receivers and selectors.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 01 Aug 2013 23:33:11 +0100
changeset 148 c2a799334bf8
parent 147 91e4feb2c8b5
child 149 37121ced3644
BenchmarkPerform: add sequential, uniform and normal distribution of both receivers and selectors.
s/benchmarks/micro/BenchmarkPerform.st
--- a/s/benchmarks/micro/BenchmarkPerform.st	Thu Aug 01 19:19:16 2013 +0100
+++ b/s/benchmarks/micro/BenchmarkPerform.st	Thu Aug 01 23:33:11 2013 +0100
@@ -1,8 +1,9 @@
 "{ Package: 'jv:calipel/s/benchmarks/micro' }"
 
 Object subclass:#BenchmarkPerform
-	instanceVariableNames:'receivers selectors iterations nreceivers nselectors nargs'
-	classVariableNames:''
+	instanceVariableNames:'receivers selectors iterations nreceivers nselectors nargs
+		recdistrib seldistrib recindices selindices'
+	classVariableNames:'Generators GeneratorSequential GeneratorUniform GeneratorGaussian'
 	poolDictionaries:''
 	category:'CalipeL-S-Benchmarks-Micro'
 !
@@ -33,360 +34,401 @@
 "
 ! !
 
+!BenchmarkPerform class methodsFor:'initialization'!
+
+initialize
+    "Invoked at system start or when the class is dynamically loaded."
+
+    | rng seq  |
+
+    rng := Random new seed: 131.
+    seq := 0.
+
+    GeneratorSequential := [:upper | | v | v := seq. seq := seq + 1. (v \\ upper) + 1 ].
+    GeneratorUniform := [:upper | rng nextInt: upper ].
+    GeneratorGaussian := [:upper | 
+        | nrng x1 x2 w y1 y2 v0 |
+
+        nrng := [
+            | v |
+            y2 notNil ifTrue: [ 
+                v := y2.
+                y2 := nil.
+            ] ifFalse:[
+                [
+                    x1 := (2.0 * rng next) - 1.0.
+                    x2 := (2.0 * rng next) - 1.0.
+                    w := x1 * x1 + (x2 * x2).
+                    w >= 1.0 
+                ] whileTrue.
+                w := (-2.0 * w ln / w) sqrt.
+                y1 := x1 * w.
+                y2 := x2 * w.
+                v :=  y1.
+            ].
+            v
+        ].
+        [ 
+            v0 := (((nrng value) * (upper / 2.0 / 3.5"deviations")) +  (upper / 2.0)) truncated.
+            v0 < 1 or:[v0 > upper ]
+        ] whileTrue.
+        v0.
+    ].
+
+    Generators := Dictionary new.
+    Generators at: #sequential put: GeneratorSequential.
+    Generators at: #uniform put: GeneratorUniform.
+    Generators at: #normal put: GeneratorGaussian.
+
+    "
+    self initialize.
+
+    GeneratorSequential value: 10.
+    GeneratorUniform value: 10.
+    GeneratorGaussian value: 10.
+
+
+
+
+
+    "
+
+    "Modified: / 01-08-2013 / 23:03:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkPerform class methodsFor:'running'!
+
+run
+    ^ (BenchmarkSuite class:self) run
+
+    "Created: / 10-06-2013 / 21:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+run: benchmark
+    ^ (BenchmarkInstance class:self selector:benchmark) run
+
+    "Created: / 31-05-2013 / 10:39:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 10-06-2013 / 21:53:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkPerform methodsFor:'accessing'!
+
+recdistrib
+    ^ recdistrib
+!
+
+recdistrib:aSymbol
+    <parameter: #recdistrib type: Symbol default: #uniform values: #(#sequential #uniform #normal)>
+    recdistrib := aSymbol.
+
+    "Modified: / 01-08-2013 / 20:16:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+seldistrib
+    ^ seldistrib
+!
+
+seldistrib:aSymbol
+    <parameter: #seldistrib type: Symbol default: #uniform values: #(#sequential #uniform #normal)>
+    seldistrib := aSymbol.
+
+    "Modified: / 01-08-2013 / 20:17:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkPerform methodsFor:'benchmarks'!
 
 benchmark0
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s |
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+0.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s
-    ]
+    ].
+
+    "
+    BenchmarkPerform run: #benchmark0
+    "
 
     "Created: / 20-07-2013 / 11:13:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 01-08-2013 / 23:22:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark1
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+1.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1
     ]
 
     "Created: / 20-07-2013 / 11:14:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:29:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark2
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+2.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1 with: 2.
     ]
 
     "Created: / 20-07-2013 / 11:14:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:29:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark3
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+3.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1 with: 2 with: 3
     ]
 
     "Created: / 20-07-2013 / 11:15:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:29:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark4
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+4.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1 with: 2 with: 3 with: 4
     ]
 
     "Created: / 20-07-2013 / 11:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:29:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark5
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+5.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1 with: 2 with: 3 with: 4 with:5
     ]
 
     "Created: / 20-07-2013 / 11:16:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark6
     <benchmark>
 
-    | sels r ri s si ripsi|
+    | sels r s|
 
-    ri := 1.
-    si := 1.
     sels := selectors at: 1+6.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s with: 1 with: 2 with: 3 with: 4 with:5  with:6
     ]
 
     "Created: / 20-07-2013 / 11:16:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark7
     <benchmark>
 
-    | na sels r ri s si ripsi args |
-
-    ri := 1.
-    si := 1.
+    | na sels r s args |
     na := 7.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:17:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark8
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
+
     na := 8.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:17:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmark9
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 9.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:17:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkA
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 10.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:17:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkB
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 11.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:17:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:30:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkC
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 12.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:18:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:31:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkD
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 13.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:18:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:31:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkE
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 14.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:18:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchmarkF
     <benchmark>
 
-    | na sels r ri s si ripsi args |
+    | na sels r s args |
 
-    ri := 1.
-    si := 1.
     na := 15.
     sels := selectors at: 1+7.
     args := Array new: na.
     1 to: iterations * 1000 do:[:i|
-        ripsi := ri + si.
-        ri := ri + 1.
-        si := si + 1.
-        r := receivers at: (ripsi \\ nreceivers) + 1.
-        s := sels at: (ripsi \\ nselectors) + 1.
+        r := receivers at: (recindices at: ((i \\ nreceivers) + 1)).
+        s := sels at: (selindices at: ((i \\ nselectors) + 1)).
 
         r perform: s withArguments: args
     ]
 
     "Created: / 20-07-2013 / 11:18:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:31:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkPerform methodsFor:'parameters'!
@@ -429,7 +471,7 @@
 setUp
     <setup>
 
-    | random |
+    | rng1 rng2 |
 
     nreceivers isNil ifTrue:[
         BenchmarkParameterError new signal:'No value set for parameter ''nreceivers''!!'.    
@@ -440,7 +482,7 @@
 
     receivers := Smalltalk allClasses asArray copyFrom: 1 to: nreceivers.
 
-    random := Random new seed: 173.
+    rng1 := Random new seed: 173.
     selectors := Array new: 16.
     1 to: 16 do:[:na|
         | bucket |
@@ -483,16 +525,28 @@
                             "14" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9 a:aA a:aB a:aC a:aD a:aE'
                             "15" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9 a:aA a:aB a:aC a:aD a:aE a:aF'
                 ) at: na.
-                no := random nextInteger printString.
+                no := rng1 nextInteger printString.
                 Object compile: 'm' , no , suffixMethod , '
                 ^ 123456' classified: 'benchmark-mocks'.
                 ('m', no , suffixSel) asSymbol.
         ].
         selectors at: na put: bucket.
+    ].
+
+    rng2 := Generators at: recdistrib.
+    recindices := Array new: nreceivers.
+    1 to: recindices size do:[:i|
+        recindices  at: i put: (rng2 value: recindices size).
+    ].
+
+    rng2 := Generators at: seldistrib.
+    selindices  := Array new: nselectors.
+    1 to: selindices size do:[:i|
+        selindices  at: i put: (rng2 value: selindices  size).
     ]
 
     "Created: / 20-07-2013 / 00:55:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 20-07-2013 / 02:35:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-08-2013 / 23:19:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
@@ -507,3 +561,12 @@
     "Created: / 20-07-2013 / 02:11:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkPerform class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
+
+BenchmarkPerform initialize!