s/benchmarks/micro/BenchmarkPerform.st
changeset 135 b80ce920afe2
child 138 96cfb2a1348d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/benchmarks/micro/BenchmarkPerform.st	Sat Jul 20 12:25:48 2013 +0100
@@ -0,0 +1,509 @@
+"{ Package: 'jv:calipel/s/benchmarks/micro' }"
+
+Object subclass:#BenchmarkPerform
+	instanceVariableNames:'receivers selectors iterations nreceivers nselectors nargs'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Benchmarks-Micro'
+!
+
+!BenchmarkPerform class methodsFor:'documentation'!
+
+documentation
+"
+ Replace 'Object', 'NewClass1' and
+ the empty string arguments by true values.
+
+ Install (or change) the class by 'accepting',
+ either via the menu or the keyboard (usually CMD-A).
+
+ You can also change the category simply by editing
+ the categoryString and accepting.
+
+ To be nice to others (and yourself later), do not forget to
+ add some documentation; preferably under the classes documentation
+ protocol.
+ (see the `create documentation stubs' item in the methodList menu;
+  switch from instance to class to find this menu item.)
+
+ Notice, that ST/X uses the convention to document the class using
+ comment-only class methods (however, ST80 comments are supported and
+ can be changed via the class-documentation menu).
+
+"
+! !
+
+!BenchmarkPerform methodsFor:'benchmarks'!
+
+benchmark0
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 perform: s
+    ]
+
+    "Created: / 20-07-2013 / 11:13:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark1
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 perform: s with: 1
+    ]
+
+    "Created: / 20-07-2013 / 11:14:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark2
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 perform: s with: 1 with: 2.
+    ]
+
+    "Created: / 20-07-2013 / 11:14:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark3
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 perform: s with: 1 with: 2 with: 3
+    ]
+
+    "Created: / 20-07-2013 / 11:15:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark4
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 perform: s with: 1 with: 2 with: 3 with: 4
+    ]
+
+    "Created: / 20-07-2013 / 11:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark5
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 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>"
+!
+
+benchmark6
+    <benchmark>
+
+    | sels r ri s si ripsi|
+
+    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 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>"
+!
+
+benchmark7
+    <benchmark>
+
+    | na sels r ri s si ripsi args |
+
+    ri := 1.
+    si := 1.
+    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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:17:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark8
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:17:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmark9
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:17:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkA
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:17:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkB
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:17:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkC
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:18:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkD
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:18:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkE
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:18:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+benchmarkF
+    <benchmark>
+
+    | na sels r ri s si ripsi 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 perform: s withArguments: na 
+    ]
+
+    "Created: / 20-07-2013 / 11:18:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkPerform methodsFor:'parameters'!
+
+iterations
+    ^ iterations
+!
+
+iterations:anInteger
+    <parameter: 'How many interations in outer loop' type: #Integer default: 1000>
+    iterations := anInteger.
+
+    "Modified: / 20-07-2013 / 01:16:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nreceivers
+    ^ nreceivers
+!
+
+nreceivers:anInteger
+    <parameter: 'Number of different receivers to send messages to' type: #Integer>
+    nreceivers := anInteger.
+
+    "Modified: / 20-07-2013 / 01:06:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nselectors
+    ^ nselectors
+!
+
+nselectors:anInteger
+    <parameter: 'Number of different messages to send' type: #Integer>
+    nselectors := anInteger.
+
+    "Modified: / 20-07-2013 / 01:07:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkPerform methodsFor:'running'!
+
+setUp
+    <setup>
+
+    | random |
+
+    nreceivers isNil ifTrue:[
+        BenchmarkParameterError new signal:'No value set for parameter ''nreceivers''!!'.    
+    ].
+    nselectors isNil ifTrue:[
+        BenchmarkParameterError new signal:'No value set for parameter ''nselectors''!!'.    
+    ].
+
+    receivers := Smalltalk allClasses asArray copyFrom: 1 to: nreceivers.
+
+    random := Random new seed: 173.
+    selectors := Array new: 16.
+    1 to: 16 do:[:na|
+        | bucket |
+
+        bucket := (1 to: nselectors) collect:[:i|
+            | no suffixSel suffixMethod |
+            suffixSel := #(
+                            "00" ''
+                            "01" ':'
+                            "02" ':a:'
+                            "03" ':a:a:'
+                            "04" ':a:a:a:'
+                            "05" ':a:a:a:a:'
+                            "06" ':a:a:a:a:a:'
+                            "07" ':a:a:a:a:a:a:'
+                            "08" ':a:a:a:a:a:a:a:'
+                            "09" ':a:a:a:a:a:a:a:a:'
+                            "10" ':a:a:a:a:a:a:a:a:a:'
+                            "11" ':a:a:a:a:a:a:a:a:a:a:'
+                            "12" ':a:a:a:a:a:a:a:a:a:a:a:'
+                            "13" ':a:a:a:a:a:a:a:a:a:a:a:a:'
+                            "14" ':a:a:a:a:a:a:a:a:a:a:a:a:a:'
+                            "15" ':a:a:a:a:a:a:a:a:a:a:a:a:a:a:'
+                ) at: na.
+                suffixMethod := #(
+                            "00" ''
+                            "01" ':a1'
+                            "02" ':a1 a:a2'
+                            "03" ':a1 a:a2 a:a3'
+                            "04" ':a1 a:a2 a:a3 a:a4'
+                            "05" ':a1 a:a2 a:a3 a:a4 a:a5'
+                            "06" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6'
+                            "07" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7'
+                            "08" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8'
+                            "09" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9'
+                            "10" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9 a:aA'
+                            "11" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9 a:aA a:aB'
+                            "12" ':a1 a:a2 a:a3 a:a4 a:a5 a:a6 a:a7 a:a8 a:a9 a:aA a:aB a:aC'
+                            "13" ':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'
+                            "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.
+                Object compile: 'm' , no , suffixMethod , '
+                ^ 123456' classified: 'benchmark-mocks'.
+                ('m', no , suffixSel) asSymbol.
+        ].
+        selectors at: na put: bucket.
+    ]
+
+    "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>"
+!
+
+tearDown
+    <teardown>
+
+    selectors do:[:bucket|
+        bucket do:[:selector|
+            Object removeSelector: selector
+        ]
+    ]
+
+    "Created: / 20-07-2013 / 02:11:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+