Added BenchmarkPerform to bemnchmark perform: methods.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 20 Jul 2013 12:25:48 +0100
changeset 135 b80ce920afe2
parent 134 287e1365b137
child 136 690b5f103c60
Added BenchmarkPerform to bemnchmark perform: methods.
s/benchmarks/micro/BenchmarkMicro.st
s/benchmarks/micro/BenchmarkPerform.st
s/benchmarks/micro/Make.proto
s/benchmarks/micro/Make.spec
s/benchmarks/micro/abbrev.stc
s/benchmarks/micro/bc.mak
s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st
s/benchmarks/micro/libInit.cc
s/benchmarks/micro/micro.rc
--- a/s/benchmarks/micro/BenchmarkMicro.st	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/BenchmarkMicro.st	Sat Jul 20 12:25:48 2013 +0100
@@ -23,6 +23,19 @@
     "Modified: / 10-06-2013 / 21:53:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkMicro methodsFor:'accessing'!
+
+iterations
+    ^ iterations
+!
+
+iterations:anInteger
+    <parameter: #iterations type: #Integer default: 1000>
+    iterations := anInteger.
+
+    "Modified: / 20-07-2013 / 00:35:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkMicro methodsFor:'benchmarks'!
 
 ackermann
--- /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>"
+! !
+
--- a/s/benchmarks/micro/Make.proto	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/Make.proto	Sat Jul 20 12:25:48 2013 +0100
@@ -121,6 +121,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/s/benchmarks/micro/Make.spec	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/Make.spec	Sat Jul 20 12:25:48 2013 +0100
@@ -50,12 +50,14 @@
 STCWARNINGS=-warnNonStandard
 
 COMMON_CLASSES= \
+	BenchmarkPerform \
 	jv_calipel_s_benchmarks_micro \
 
 
 
 
 COMMON_OBJS= \
+    $(OUTDIR_SLASH)BenchmarkPerform.$(O) \
     $(OUTDIR_SLASH)jv_calipel_s_benchmarks_micro.$(O) \
 
 
--- a/s/benchmarks/micro/abbrev.stc	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/abbrev.stc	Sat Jul 20 12:25:48 2013 +0100
@@ -2,4 +2,5 @@
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
 BenchmarkMicro BenchmarkMicro jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
+BenchmarkPerform BenchmarkPerform jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
 jv_calipel_s_benchmarks_micro jv_calipel_s_benchmarks_micro jv:calipel/s/benchmarks/micro '* Projects & Packages *' 3
--- a/s/benchmarks/micro/bc.mak	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/bc.mak	Sat Jul 20 12:25:48 2013 +0100
@@ -67,6 +67,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st	Sat Jul 20 12:25:48 2013 +0100
@@ -41,6 +41,7 @@
 
     ^ #(
         #'jv:calipel/s'    "BenchmarkInstance - referenced by BenchmarkMicro class>>run: "
+        #'stx:libbasic2'    "Random - referenced by BenchmarkPerform>>setUp "
     )
 !
 
@@ -77,6 +78,7 @@
     ^ #(
         "<className> or (<className> attributes...) in load order"
         (BenchmarkMicro autoload)
+        BenchmarkPerform
         #'jv_calipel_s_benchmarks_micro'
     )
 !
--- a/s/benchmarks/micro/libInit.cc	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/libInit.cc	Sat Jul 20 12:25:48 2013 +0100
@@ -27,6 +27,7 @@
 void _libjv_calipel_s_benchmarks_micro_Init(pass, __pRT__, snd)
 OBJ snd; struct __vmData__ *__pRT__; {
 __BEGIN_PACKAGE2__("libjv_calipel_s_benchmarks_micro", _libjv_calipel_s_benchmarks_micro_Init, "jv:calipel/s/benchmarks/micro");
+_BenchmarkPerform_Init(pass,__pRT__,snd);
 _jv_137calipel_137s_137benchmarks_137micro_Init(pass,__pRT__,snd);
 
 
--- a/s/benchmarks/micro/micro.rc	Fri Jul 19 23:38:23 2013 +0100
+++ b/s/benchmarks/micro/micro.rc	Sat Jul 20 12:25:48 2013 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Sun, 14 Jul 2013 18:36:56 GMT\0"
+      VALUE "ProductDate", "Sat, 20 Jul 2013 11:19:41 GMT\0"
     END
 
   END