Merge
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 04 Dec 2014 00:25:31 +0000
changeset 266 cce61dc1d656
parent 265 849a61efd824 (current diff)
parent 263 9c16ef57c800 (diff)
child 267 5c032df036a4
Merge
.hgsub
.hgsubstate
doc
--- a/.hgsub	Thu Dec 04 00:12:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-wiki = wiki
--- a/.hgsubstate	Thu Dec 04 00:12:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-82b067b748a1b187144eb62111f2ee13d0432c5d wiki
--- a/doc	Thu Dec 04 00:12:57 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-wiki
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/BenchmarkCountingInstrument.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,66 @@
+"{ Package: 'jv:calipel/s' }"
+
+BenchmarkMeasurementInstrument subclass:#BenchmarkCountingInstrument
+	instanceVariableNames:'c0 c1'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Core-Measurement'
+!
+
+!BenchmarkCountingInstrument class methodsFor:'queries'!
+
+isAbstract
+    "Return if this class is an abstract class.
+     True is returned here for myself only; false for subclasses.
+     Abstract subclasses must redefine again."
+
+    ^ self == BenchmarkCountingInstrument.
+! !
+
+!BenchmarkCountingInstrument methodsFor:'accessing'!
+
+measurementUnit
+    "Return a string describing a unit of this instrument, i.e., msecs
+     for time or '1' for plain counters"
+    
+    ^ '1'
+
+    "Created: / 27-11-2014 / 12:39:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkCountingInstrument methodsFor:'measurement'!
+
+measurementStart:aBenchmarkInstance 
+    "superclass BenchmarkMeasurementInstrument says that I am responsible to implement this method"
+    
+    ^ c0 := self getCounterValue
+
+    "Created: / 27-11-2014 / 12:41:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:44:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementStop:aBenchmarkInstance 
+    "superclass BenchmarkMeasurementInstrument says that I am responsible to implement this method"
+    
+    ^ c1 := self getCounterValue
+
+    "Created: / 27-11-2014 / 12:41:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementValue
+    "superclass BenchmarkMeasurementInstrument says that I am responsible to implement this method"
+
+    ^ c1 - c0
+
+    "Created: / 27-11-2014 / 12:40:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkCountingInstrument methodsFor:'private'!
+
+getCounterValue
+    ^ self subclassResponsibility
+
+    "Created: / 27-11-2014 / 12:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/s/BenchmarkError.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkError.st	Thu Dec 04 00:25:31 2014 +0000
@@ -7,3 +7,11 @@
 	category:'CalipeL-S-Core-Exceptions'
 !
 
+
+!BenchmarkError class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/BenchmarkExecutionTimeInstrument.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,92 @@
+"{ Package: 'jv:calipel/s' }"
+
+BenchmarkMeasurementInstrument subclass:#BenchmarkExecutionTimeInstrument
+	instanceVariableNames:'t0 t1'
+	classVariableNames:'MillisecondsTime'
+	poolDictionaries:''
+	category:'CalipeL-S-Core-Measurement'
+!
+
+!BenchmarkExecutionTimeInstrument class methodsFor:'documentation'!
+
+documentation
+"
+    The one and only instrument that is guaranteed to be on every platform.
+    It measures time to run a benchmark (real time).
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!BenchmarkExecutionTimeInstrument methodsFor:'accessing'!
+
+measurementInstrumentName
+    "Returns a human-readable name of this instrument"
+    
+    ^ 'Execution Time'
+
+    "Created: / 01-12-2014 / 02:36:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementUnit
+    "Return a string describing a unit of this instrument, i.e., msecs
+     for time or '1' for plain counters"
+    
+    ^ 'ms'
+
+    "Created: / 24-11-2014 / 23:47:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-11-2014 / 01:09:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+name
+    "Returns a human-readable name of this instrument"
+
+    ^ 'Execution Time'
+
+    "Created: / 24-11-2014 / 23:47:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkExecutionTimeInstrument methodsFor:'measurement'!
+
+measurementStart:aBenchmarkInstance 
+    "superclass BenchmarkMeasurementInstrument says that I am responsible to implement this method"
+    
+    t0 := BenchmarkPlatform current millisecondTime
+
+    "Created: / 24-11-2014 / 08:49:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-11-2014 / 12:09:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:44:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementStop:aBenchmarkInstance 
+    t1 := BenchmarkPlatform current millisecondTime
+
+    "Created: / 24-11-2014 / 08:49:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-11-2014 / 12:09:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:45:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementValue
+    "superclass BenchmarkMeasurementInstrument says that I am responsible to implement this method"
+
+    ^ t1 - t0
+
+    "Created: / 24-11-2014 / 08:49:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkExecutionTimeInstrument methodsFor:'testing'!
+
+isExecutionTimeInstrument
+    ^ true
+
+    "Created: / 24-11-2014 / 07:16:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/s/BenchmarkExecutor.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkExecutor.st	Thu Dec 04 00:25:31 2014 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'jv:calipel/s' }"
 
 Object subclass:#BenchmarkExecutor
-	instanceVariableNames:''
+	instanceVariableNames:'instruments'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'CalipeL-S-Core'
@@ -27,6 +27,14 @@
 "
 ! !
 
+!BenchmarkExecutor class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
 !BenchmarkExecutor class methodsFor:'execution'!
 
 execute:aBenchmarkInstance
@@ -41,6 +49,20 @@
     ^ self new execute:aBenchmarkInstance result:aBenchmarkResult defines:aDictionary
 ! !
 
+!BenchmarkExecutor methodsFor:'accessing'!
+
+instruments
+    ^ instruments
+!
+
+instruments:aCollection
+    "Set a list of user-defined mersurement instruments"
+
+    instruments := aCollection.
+
+    "Modified (comment): / 27-11-2014 / 13:43:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkExecutor methodsFor:'executing'!
 
 execute: aBenchmarkInstance
@@ -216,6 +238,19 @@
 
 !BenchmarkExecutor methodsFor:'executing-private'!
 
+benchmark: aBenchmarkInstance
+    | measurements |
+    [
+        measurements := aBenchmarkInstance benchmarkUsingInstruments: (BenchmarkPlatform current instruments) , instruments.
+    ] on: Error do:[:ex|
+        BenchmarkExecutionError new signal:'Error during measurement: ', ex description.      
+    ].
+    ^measurements
+
+    "Created: / 24-11-2014 / 00:18:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-11-2014 / 13:43:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 execute: aBenchmarkInstance result: aBenchmarkResult parameters: aCollection
     "
     Takes a benchmark instance and a set of parameter defines,
@@ -224,7 +259,7 @@
 
     This is where real execution happens"
 
-    | times outcome |
+    | measurements outcome |
 
     "First, warm it up"
     [ 
@@ -234,10 +269,10 @@
         self tearDown: aBenchmarkInstance
     ].
 
-    times := (1 to: aBenchmarkResult runs) collect:[:i | 
+    measurements := (1 to: aBenchmarkResult runs) collect:[:i | 
         [
             self setUp:aBenchmarkInstance parameters: aCollection.  
-            self timeIt: aBenchmarkInstance 
+            self benchmark: aBenchmarkInstance 
         ] ensure:[
             self tearDown: aBenchmarkInstance
         ].
@@ -246,13 +281,13 @@
     aBenchmarkResult addOutcome:
         (outcome := BenchmarkOutcome 
             benchmark: aBenchmarkInstance
-            times: times
-            parameters: aCollection).
+            parameters: aCollection
+            measurements: measurements).     
 
     ^ outcome
 
     "Created: / 27-07-2013 / 12:32:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (format): / 10-03-2014 / 09:36:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-11-2014 / 06:54:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 setUp:aBenchmarkInstance parameters: aCollection
@@ -297,19 +332,6 @@
     "Modified: / 31-07-2013 / 01:03:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-timeIt: aBenchmarkInstance
-    | t |
-    [
-        t := aBenchmarkInstance timeIt.
-    ] on: Error do:[:ex|
-        BenchmarkExecutionError new signal:'Error during measurement: ', ex description.      
-    ].
-    ^t
-
-    "Created: / 24-06-2013 / 01:11:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 31-07-2013 / 01:03:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 warmUp: aBenchmarkInstance
     [
         aBenchmarkInstance warmUp.
@@ -321,6 +343,16 @@
     "Modified: / 31-07-2013 / 01:04:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkExecutor methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    instruments := #()
+
+    "Modified: / 27-11-2014 / 13:42:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkExecutor methodsFor:'profiling-private'!
 
 spy: aBenchmarkInstance result: aBenchmarkResult parameters: aCollection
--- a/s/BenchmarkInstance.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkInstance.st	Thu Dec 04 00:25:31 2014 +0000
@@ -354,6 +354,42 @@
 
 !BenchmarkInstance methodsFor:'running-private'!
 
+benchmarkUsingInstruments:instruments 
+    | profile  profiler  measurements  instrumentArray executuonTimeInstrument |
+
+    instrumentArray := instruments asArray.
+    executuonTimeInstrument := instrumentArray detect:[:each | BenchmarkMeasurementInstrument isExecuttionTimeInstrument: each ] ifNone:[ nil ].
+    executuonTimeInstrument notNil ifTrue:[ 
+        instrumentArray swap: (instrumentArray identityIndexOf: executuonTimeInstrument) with: instrumentArray size.  
+    ].
+     " Special - check if running under callgrind, if so,
+     request instrumentation - supported only on Smalltalk/X "
+    profile := Smalltalk isSmalltalkX 
+            and:[
+                (Smalltalk at:#Profiler) notNil 
+                    and:[ (Smalltalk at:#Profiler) valgrind runningUnderValgrind ]
+            ].
+    profile ifTrue:[
+        profiler := (Smalltalk at:#Profiler) valgrind.
+        profiler callgrindInstrumentationStart.
+    ].
+    instrumentArray do:[:i | 
+        i measurementStart:self
+    ].
+    instance perform:benchmarkSelector.
+    instrumentArray reverseDo:[:i | 
+        i measurementStop:self
+    ].
+    profile ifTrue:[
+        profiler callgrindInstrumentationStop.
+    ].
+    measurements := instrumentArray collect:[:i | BenchmarkMeasurement instrument:i value:i measurementValue ].
+    ^ measurements
+
+    "Created: / 24-11-2014 / 00:17:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-12-2014 / 23:32:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 setUp
     setUpSelector1 notNil ifTrue:[
         instance perform: setUpSelector1 
@@ -404,30 +440,6 @@
     "Modified: / 09-03-2014 / 23:18:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-timeIt
-    | t0 t1 profile profiler  |
-
-    " Special - check if running under callgrind, if so,
-      request instrumentation - supported only on Smalltalk/X "
-    profile := Smalltalk isSmalltalkX
-                    and:[ (Smalltalk at:#Profiler) notNil 
-                    and:[ (Smalltalk at:#Profiler) valgrind runningUnderValgrind]].
-    profile ifTrue:[
-        profiler := (Smalltalk at:#Profiler) valgrind.
-        profiler callgrindInstrumentationStart. 
-    ].
-    t0 := MillisecondsTime value.
-    instance perform:benchmarkSelector.
-    t1 := MillisecondsTime value.
-    profile ifTrue:[
-        profiler callgrindInstrumentationStop. 
-    ].
-    ^ t1 - t0
-
-    "Created: / 24-06-2013 / 00:51:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 22-05-2014 / 12:01:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 warmUp
     | warmed |
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/BenchmarkMeasurement.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,56 @@
+"{ Package: 'jv:calipel/s' }"
+
+Object subclass:#BenchmarkMeasurement
+	instanceVariableNames:'value instrument'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Core-Measurement'
+!
+
+!BenchmarkMeasurement class methodsFor:'documentation'!
+
+documentation
+"
+    BenchmarkMeasurement is a simple value object that keeps a value
+    measured by some intrument
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+        BenchmarkMeasurementInstrument
+
+"
+! !
+
+!BenchmarkMeasurement class methodsFor:'instance creation'!
+
+instrument: instrumentArg value: valueArg
+    ^ self new instrument: instrumentArg value: valueArg
+
+    "Created: / 24-11-2014 / 07:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMeasurement methodsFor:'accessing'!
+
+instrument
+    ^ instrument
+!
+
+value
+    ^ value
+! !
+
+!BenchmarkMeasurement methodsFor:'initialization'!
+
+instrument: instrumentArg value: valueArg
+    instrument := instrumentArg.
+    value := valueArg
+
+    "Created: / 24-11-2014 / 07:06:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/BenchmarkMeasurementInstrument.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,95 @@
+"{ Package: 'jv:calipel/s' }"
+
+Object subclass:#BenchmarkMeasurementInstrument
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Core-Measurement'
+!
+
+!BenchmarkMeasurementInstrument class methodsFor:'documentation'!
+
+documentation
+"
+    Measurement instrument provides a way to measure a particular
+    aspect (time, number og GCs, invocations of some method...).
+
+    One may create a custom instruments and hook them in to measure
+    custom, application specific aspects.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!BenchmarkMeasurementInstrument class methodsFor:'testing'!
+
+isExecuttionTimeInstrument: instrument
+    ^ (instrument respondsTo:#isExecutionTimeInstrument) and:[instrument isExecutionTimeInstrument]
+
+    "Created: / 02-12-2014 / 23:26:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMeasurementInstrument methodsFor:'accessing'!
+
+measurementInstrumentName
+    "Returns a human-readable name of this instrument"
+    
+    ^ self subclassResponsibility
+
+    "Created: / 01-12-2014 / 02:35:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementUnit
+    "Return a string describing a unit of this instrument, i.e., msecs
+     for time or '1' for plain counters"
+    
+    ^ self subclassResponsibility
+
+    "Created: / 24-11-2014 / 23:47:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMeasurementInstrument methodsFor:'measurement'!
+
+measurementStart:aBenchmarkInstance 
+    ^ self subclassResponsibility
+
+    "Created: / 24-11-2014 / 08:14:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:44:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementStop:aBenchmarkInstance 
+    ^ self subclassResponsibility
+
+    "Created: / 24-11-2014 / 08:14:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 01-12-2014 / 02:44:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementValue
+    ^ self subclassResponsibility
+
+    "Created: / 24-11-2014 / 08:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMeasurementInstrument methodsFor:'testing'!
+
+isExecutionTimeInstrument
+    ^ false
+
+    "Created: / 24-11-2014 / 07:15:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMeasurementInstrument class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/BenchmarkMeasurementValueNotAvailable.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,40 @@
+"{ Package: 'jv:calipel/s' }"
+
+Object subclass:#BenchmarkMeasurementValueNotAvailable
+	instanceVariableNames:''
+	classVariableNames:'Instance'
+	poolDictionaries:''
+	category:'CalipeL-S-Core-Measurement'
+!
+
+!BenchmarkMeasurementValueNotAvailable class methodsFor:'instance creation'!
+
+flushSingleton
+    "flushes the cached singleton"
+
+    Instance := nil
+
+    "
+     self flushSingleton
+    "
+!
+
+instance
+    "returns a singleton"
+
+    Instance isNil ifTrue:[
+        Instance := self basicNew initialize.
+    ].
+    ^ Instance.
+
+    "Created: / 01-12-2014 / 02:53:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+new
+    "returns a singleton"
+
+    ^ self instance.
+
+    "Modified: / 01-12-2014 / 02:53:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/s/BenchmarkOutcome.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkOutcome.st	Thu Dec 04 00:25:31 2014 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'jv:calipel/s' }"
 
 Object subclass:#BenchmarkOutcome
-	instanceVariableNames:'times benchmark parameters'
+	instanceVariableNames:'measurements benchmark parameters'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'CalipeL-S-Core'
@@ -10,16 +10,10 @@
 
 !BenchmarkOutcome class methodsFor:'instance creation'!
 
-benchmark:benchmarkArg times:timesArg parameters:paramsArg 
-    ^self new benchmark:benchmarkArg times:timesArg parameters:paramsArg
+benchmark: benchmark parameters: parameters measurements: measurements
+    ^ self new benchmark: benchmark parameters: parameters measurements: measurements
 
-    "Created: / 11-06-2013 / 23:19:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-instance:instanceArg times:timesArg parameters:paramsArg 
-    ^self new instance:instanceArg times:timesArg parameters:paramsArg
-
-    "Created: / 04-06-2013 / 22:26:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 24-11-2014 / 06:56:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkOutcome methodsFor:'accessing'!
@@ -30,28 +24,63 @@
     "Created: / 11-06-2013 / 23:19:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+best
+    "Return the best run, i.e., run with minimal time"
+
+    ^ measurements inject: measurements anyOne into:[ :best :each |
+        | bestTime eachTime |
+
+        bestTime := best detect:[:m | BenchmarkMeasurementInstrument isExecuttionTimeInstrument: m instrument ] ifNone:[ nil ].
+        eachTime := best detect:[:m | BenchmarkMeasurementInstrument isExecuttionTimeInstrument: m instrument ] ifNone:[ nil ].
+
+        bestTime notNil ifTrue:[ 
+            eachTime notNil ifTrue:[ 
+                eachTime value < bestTime value ifTrue:[ each ] ifFalse:[ best ]
+            ] ifFalse:[
+                best
+            ]
+        ] ifFalse:[ 
+            eachTime notNil ifTrue:[ each ] ifFalse:[ best ]
+        ].
+    ].
+
+    "Created: / 25-11-2014 / 01:18:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-12-2014 / 23:28:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurements
+    ^ measurements
+!
+
 parameters
     ^ parameters
 !
 
 time
-    ^ times min
+    ^ (self times select:[:t | t notNil]) min
 
-    "Modified: / 04-06-2013 / 22:25:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 25-11-2014 / 01:23:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 times
-    ^ times
+    ^ measurements collect:[ :run | 
+        | timeMeasurement |
+
+        timeMeasurement := run detect:[:each | BenchmarkMeasurementInstrument isExecuttionTimeInstrument: each instrument ] ifNone:[ nil ].
+        timeMeasurement value.
+    ]
+
+    "Modified: / 02-12-2014 / 23:27:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkOutcome methodsFor:'initialization'!
 
-benchmark:benchmarkArg times:timesArg parameters:paramsArg 
+benchmark: benchmarkArg parameters: parametersArg measurements: measurementsArg 
     benchmark := benchmarkArg.
-    times := timesArg.
-    parameters := paramsArg.
+    measurements := measurementsArg.
+    parameters := parametersArg.
 
-    "Created: / 11-06-2013 / 23:19:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 24-11-2014 / 06:56:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkOutcome class methodsFor:'documentation'!
--- a/s/BenchmarkPlatform.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkPlatform.st	Thu Dec 04 00:25:31 2014 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'jv:calipel/s' }"
 
 Object subclass:#BenchmarkPlatform
-	instanceVariableNames:''
+	instanceVariableNames:'instruments'
 	classVariableNames:'Current'
 	poolDictionaries:''
 	category:'CalipeL-S-Core'
@@ -33,6 +33,14 @@
 "
 ! !
 
+!BenchmarkPlatform class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
 !BenchmarkPlatform class methodsFor:'accessing'!
 
 current
@@ -41,6 +49,19 @@
     "Created: / 06-06-2013 / 08:54:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkPlatform methodsFor:'accessing-instruments'!
+
+instruments
+    "Return a list of non-intrusive instruments available on this
+     platform."
+
+    "`instruments` variable is initialized in #initialize"
+    ^ instruments
+
+    "Created: / 27-11-2014 / 12:37:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 27-11-2014 / 13:41:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkPlatform methodsFor:'accessing-performance counters'!
 
 millisecondTime
@@ -91,6 +112,18 @@
     ^ self subclassResponsibility
 ! !
 
+!BenchmarkPlatform methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    super initialize.
+    instruments := Array 
+                    with: BenchmarkExecutionTimeInstrument new
+
+    "Modified (format): / 27-11-2014 / 13:42:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkPlatform methodsFor:'queries'!
 
 isHeadless
--- a/s/BenchmarkReportJSON.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkReportJSON.st	Thu Dec 04 00:25:31 2014 +0000
@@ -80,16 +80,62 @@
     "Modified: / 12-06-2013 / 14:14:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+writeMeasurement: measurement
+    measurement value ~~ BenchmarkMeasurementValueNotAvailable instance ifTrue:[  
+        json writeDictionaryWith:[
+            json writeKey: 'instrument' valueWith: [ self writeMeasurementInstrument: measurement instrument ].
+            json writeElementSeparator.
+            json writeKey: 'value' value: measurement value
+        ].
+    ].
+
+    "Created: / 24-11-2014 / 23:41:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-12-2014 / 03:04:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeMeasurementInstrument: instrument
+    json writeDictionaryWith:[
+        json writeKey: 'name' value: instrument name.
+        json writeElementSeparator.
+        json writeKey: 'class' value: instrument class name.
+        json writeElementSeparator.
+        json writeKey: 'unit' value: instrument measurementUnit.        
+    ].
+
+    "Created: / 24-11-2014 / 23:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeMeasurements: measurements
+    json writeArrayWith:[
+        measurements do:[:run | 
+            json writeArrayWith:[
+                run do:[:measurement |  
+                    self writeMeasurement: measurement
+                ] separatedBy:[  
+                    json writeElementSeparator
+                ].
+            ].
+        ] separatedBy:[ 
+            json writeElementSeparator
+        ].
+    ].
+
+    "Created: / 24-11-2014 / 23:37:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 writeOutcome:outcome
     json writeDictionaryWith:[
         json writeKey: 'benchmark' valueWith: [ self writeBenchmark: outcome benchmark ].
         json writeElementSeparator.
-        json writeKey: 'times' value: outcome times.
+        json writeKey: 'measurements' valueWith: [ self writeMeasurements: outcome measurements ].
         json writeElementSeparator.        
         json writeKey: 'parameters' valueWith: [ self writeParameters: outcome ].
+        json writeElementSeparator.        
+        "For backward compatibility, will wanish"
+        json writeKey: 'times' value: outcome times.
     ]
 
-    "Modified: / 12-06-2013 / 14:10:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-11-2014 / 23:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 writeOutcomes
--- a/s/BenchmarkReportText.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkReportText.st	Thu Dec 04 00:25:31 2014 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'jv:calipel/s' }"
 
 BenchmarkReport subclass:#BenchmarkReportText
-	instanceVariableNames:''
+	instanceVariableNames:'colwidths colheaders colmap'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'CalipeL-S-Core-Reports'
@@ -13,7 +13,7 @@
 format: anObject width: width align: align
     | string |
 
-    string := anObject printString. 
+    string := anObject isString ifTrue:[anObject] ifFalse:[anObject printString].
     align == #left ifTrue:[
         stream nextPutAll: string.
         stream next: ((width - string size) max: 0) put: Character space.
@@ -34,45 +34,98 @@
     "Created: / 31-05-2013 / 12:09:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkReportText methodsFor:'private'!
+
+prepare
+    | instruments timeInstrument ncols |
+
+    instruments := Set new.
+    result outcomes do:[:outcome |
+        outcome best do:[:m | instruments add: m instrument ].
+    ].
+    timeInstrument := instruments detect:[:instrument | BenchmarkMeasurementInstrument isExecuttionTimeInstrument: instrument ] ifNone:[ nil ].
+    instruments remove: timeInstrument ifAbsent:[nil].
+    instruments := instruments asOrderedCollection sort:[:a :b | a measurementInstrumentName < b measurementInstrumentName ].
+    timeInstrument notNil ifTrue:[ instruments addFirst: timeInstrument ].
+
+    ncols := 1"benchmark name" + instruments size.
+    colwidths := Array new: ncols.
+    colheaders := Array new: ncols.
+    colmap := Array new: ncols.
+
+    colwidths at: 1 put: ((result outcomes inject: 0 into: [ :max :each | (max max: (each benchmark name size)) max: (each benchmark class name size) ]) max: 'Benchmark' size) + 3.
+    colheaders at: 1 put: 'Benchmark'.
+    colmap at: 1 put:[ :outcome :col | outcome benchmark name ].
+    1 to: instruments size  do:[:i |
+        | label |
+
+        label := (instruments at:i) measurementInstrumentName , ' [' , (instruments at:i) measurementUnit, ']'.
+        colwidths at: i + 1 put: label size + 3.
+        colheaders at: i + 1 put: label.
+        colmap at: i + 1 put: [ :outcome :col |
+            | measurement value |
+
+            measurement := outcome best detect:[:m | m instrument == (instruments at: col - 1) ] ifNone:[nil].
+            value := measurement notNil ifTrue:[ measurement value ] ifFalse:[ BenchmarkMeasurementValueNotAvailable instance ].
+            value ~~ BenchmarkMeasurementValueNotAvailable instance ifTrue:[ value ] ifFalse:[ 'N/A' ]
+        ].
+    ]
+
+    "Created: / 25-11-2014 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-12-2014 / 23:26:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkReportText methodsFor:'writing'!
 
+write
+    self prepare.
+    super write.
+
+    "Created: / 25-11-2014 / 01:13:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 writeFooter
 
     "Modified: / 11-06-2013 / 23:28:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 writeHeader
-    stream 
+    stream
         nextPutAll: 'Generated at :';
         nextPutAll: Date today printString;
         nextPutAll: ' ';
         nextPutAll: Time now printString;
         cr;
         cr.
+    1 to: colwidths size do:[:i |
+        self format: (colheaders at:i) width: (colwidths at: i) align: #right.
+        stream space; "nextPut: $|;"space; space.
+    ].
+    stream nextPutAll: 'Parameters'
 
-    "Modified: / 11-06-2013 / 23:28:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-11-2014 / 01:50:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 writeOutcome: outcome
-    self format: outcome benchmark name width: 25 align: #right.
-    stream nextPutAll: ' : '.
-    self format: outcome time width: 10 align: #right.
-    stream nextPutAll: ' [ms]'.
-    outcome parameters notEmpty ifTrue:[        
-            stream nextPutAll: ' {'.
+    1 to: colwidths size do:[:i |
+        self format: ((colmap at:i) value: outcome value: i) width: (colwidths at: i) align: #right.
+        stream space; "nextPut: $|;"space; space.
+    ].
+    outcome parameters notEmpty ifTrue:[
+            stream nextPutAll: '{'.
             (outcome parameters  asSortedCollection:[:a :b | a key name < b key name ]) do:[:paramAndValue|
                 stream nextPutAll: paramAndValue key name.
-                stream nextPutAll: '='.        
+                stream nextPutAll: '='.
                 stream nextPutAll: paramAndValue value storeString.
             ] separatedBy:[
-                stream nextPutAll: ', '.            
+                stream nextPutAll: ', '.
             ].
             stream nextPutAll: '}'.
             ].
     stream cr.
 
     "Created: / 11-06-2013 / 23:24:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-08-2013 / 18:09:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-11-2014 / 13:25:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 writeOutcomes
@@ -82,13 +135,14 @@
     result outcomesDo:[:outcome |
         outcome benchmark instance class == class ifFalse:[
             class := outcome benchmark instance class.
-            stream nextPutAll: '== ', class name , ' =='; cr.
+            stream cr; nextPutAll: class name; cr.
         ].
         self writeOutcome: outcome
     ].
     stream cr.
 
     "Created: / 11-06-2013 / 23:24:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-11-2014 / 01:45:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkReportText class methodsFor:'documentation'!
--- a/s/BenchmarkResult.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkResult.st	Thu Dec 04 00:25:31 2014 +0000
@@ -118,6 +118,32 @@
     "Created: / 23-06-2013 / 00:39:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkResult methodsFor:'inspecting'!
+
+inspector2TabJSON
+    <inspector2Tab>
+
+    ^ (self newInspector2Tab)
+        label:'JSON report';
+        priority:50;
+        text: [ String streamContents: [:s | BenchmarkReport json write: self on: s ] ];
+        yourself
+
+    "Modified: / 25-11-2014 / 01:07:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+inspector2TabTEXT
+    <inspector2Tab>
+
+    ^ (self newInspector2Tab)
+        label:'Text report';
+        priority:51;
+        text: [ String streamContents: [:s | BenchmarkReport text write: self on: s ] ];
+        yourself
+
+    "Created: / 25-11-2014 / 01:07:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkResult methodsFor:'printing & storing'!
 
 printOn:aStream
--- a/s/BenchmarkRunner.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkRunner.st	Thu Dec 04 00:25:31 2014 +0000
@@ -38,11 +38,12 @@
 !BenchmarkRunner methodsFor:'main'!
 
 main:argv0
-    | i report name file params classes runs argv desc setup setupScript teardown teardownScript |
+    | i report instruments name file params classes runs argv desc setup setupScript teardown teardownScript executor |
 
     params := Dictionary new.
     classes := OrderedCollection new.
     report := BenchmarkReport text.
+    instruments := OrderedCollection new.
     runs := 5.
     argv := argv0 asOrderedCollection.
 
@@ -97,6 +98,23 @@
                     self error: 'No report class named ''', reportNm, ''''.
                 ].
             ].
+
+            (arg = '-i' or:[arg = '--instrument']) ifTrue:[
+                | instrumentNm instrumentCls |
+
+                i > argv size ifTrue:[
+                    self error: arg, ' requires a valid class name parameter'
+                ].
+                instrumentNm := (argv at: i).
+                i := i + 1.
+                instrumentCls := Smalltalk at: instrumentNm asSymbol.
+                instrumentCls isNil ifTrue:[
+                    self error: 'No instrument class named ''', instrumentNm, ''''.
+                ] ifFalse:[ 
+                    instruments add: instrumentCls new.
+                ].
+            ].    
+
             arg = '--text' ifTrue:[
                 report := BenchmarkReport text.
             ].
@@ -209,8 +227,10 @@
 
     "Run suite"
     result := BenchmarkResult new.
+    executor := BenchmarkRunnerExecutor new.
+    executor instruments: instruments.
     result runs: runs.
-    suite run: result with: params executor: BenchmarkRunnerExecutor new.
+    suite run: result with: params executor: executor.
 
     "Write report"
     file notNil ifTrue:[
@@ -231,7 +251,7 @@
     teardown notNil ifTrue:[ Compiler evaluate: teardown ].
     teardownScript notNil ifTrue:[ Compiler evaluate: teardownScript asFilename contents asString ].
 
-    "Modified: / 08-03-2014 / 16:23:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-11-2014 / 00:21:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 options
@@ -242,7 +262,8 @@
 Common options:
   -o FILE ................ write output to FILE instead of to standard output (default: stdout)
   -n RUNS ................ how many times to run each bechmark (default: 5)
-  -r REPORTCLASS ......... user REPORTCLASS to generate report (default: BenchmarkReportText)
+  -r REPORTCLASS ......... use REPORTCLASS to generate report (default: BenchmarkReportText)
+  -i | --instrument CLS .. add instance if CLS to set instruments (may be specified multiple times)
   --arguments FILE ....... read additional arguments from FILE
   --setup EXPR ........... evaluate EXPR before actually running any benchmark
   --setup-script FILE .... evaluate code in FILE before actually running any benchmark
@@ -263,7 +284,7 @@
 '
 
     "Created: / 06-06-2013 / 11:01:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 30-09-2014 / 09:57:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-11-2014 / 00:16:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkRunner methodsFor:'private-parsing'!
--- a/s/BenchmarkRunnerExecutor.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/BenchmarkRunnerExecutor.st	Thu Dec 04 00:25:31 2014 +0000
@@ -51,6 +51,13 @@
 
 !BenchmarkRunnerExecutor methodsFor:'executing-private'!
 
+benchmark: aBenchmarkInstance
+    transcript nextPutAll: 'B..'.
+    ^super benchmark: aBenchmarkInstance.
+
+    "Created: / 24-11-2014 / 00:18:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 execute: aBenchmarkInstance result: aBenchmarkResult parameters: aCollection
     | nm outcome |
 
@@ -107,13 +114,6 @@
     "Created: / 24-06-2013 / 01:21:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-timeIt: aBenchmarkInstance
-    transcript nextPutAll: 'B..'.
-    ^super timeIt: aBenchmarkInstance.
-
-    "Created: / 24-06-2013 / 01:22:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 warmUp: aBenchmarkInstance
     transcript nextPutAll: 'W..'.
     super warmUp: aBenchmarkInstance.
--- a/s/Make.proto	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/Make.proto	Thu Dec 04 00:25:31 2014 +0000
@@ -125,6 +125,9 @@
 $(OUTDIR)BenchmarkError.$(O) BenchmarkError.$(H): BenchmarkError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkExecutor.$(O) BenchmarkExecutor.$(H): BenchmarkExecutor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkInstance.$(O) BenchmarkInstance.$(H): BenchmarkInstance.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurement.$(O) BenchmarkMeasurement.$(H): BenchmarkMeasurement.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurementInstrument.$(O) BenchmarkMeasurementInstrument.$(H): BenchmarkMeasurementInstrument.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurementValueNotAvailable.$(O) BenchmarkMeasurementValueNotAvailable.$(H): BenchmarkMeasurementValueNotAvailable.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkOutcome.$(O) BenchmarkOutcome.$(H): BenchmarkOutcome.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkParameter.$(O) BenchmarkParameter.$(H): BenchmarkParameter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkPlatform.$(O) BenchmarkPlatform.$(H): BenchmarkPlatform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -134,7 +137,9 @@
 $(OUTDIR)BenchmarkRunner.$(O) BenchmarkRunner.$(H): BenchmarkRunner.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkSuite.$(O) BenchmarkSuite.$(H): BenchmarkSuite.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s.$(O) jv_calipel_s.$(H): jv_calipel_s.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkCountingInstrument.$(O) BenchmarkCountingInstrument.$(H): BenchmarkCountingInstrument.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkExecutionError.$(O) BenchmarkExecutionError.$(H): BenchmarkExecutionError.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkExecutionTimeInstrument.$(O) BenchmarkExecutionTimeInstrument.$(H): BenchmarkExecutionTimeInstrument.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkParameterError.$(O) BenchmarkParameterError.$(H): BenchmarkParameterError.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkReportJSON.$(O) BenchmarkReportJSON.$(H): BenchmarkReportJSON.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkReport.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkReportText.$(O) BenchmarkReportText.$(H): BenchmarkReportText.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkReport.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/s/Make.spec	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/Make.spec	Thu Dec 04 00:25:31 2014 +0000
@@ -42,6 +42,7 @@
 #  -warnNonStandard : no warnings about ST/X extensions
 #  -warnEOLComments : no warnings about EOL comment extension
 #  -warnPrivacy     : no warnings about privateClass extension
+#  -warnUnused      : no warnings about unused variables
 #
 # ********** OPTIONAL: MODIFY the next line(s) ***
 # STCWARNINGS=-warn
@@ -54,6 +55,9 @@
 	BenchmarkError \
 	BenchmarkExecutor \
 	BenchmarkInstance \
+	BenchmarkMeasurement \
+	BenchmarkMeasurementInstrument \
+	BenchmarkMeasurementValueNotAvailable \
 	BenchmarkOutcome \
 	BenchmarkParameter \
 	BenchmarkPlatform \
@@ -63,7 +67,9 @@
 	BenchmarkRunner \
 	BenchmarkSuite \
 	jv_calipel_s \
+	BenchmarkCountingInstrument \
 	BenchmarkExecutionError \
+	BenchmarkExecutionTimeInstrument \
 	BenchmarkParameterError \
 	BenchmarkReportJSON \
 	BenchmarkReportText \
@@ -77,6 +83,9 @@
     $(OUTDIR_SLASH)BenchmarkError.$(O) \
     $(OUTDIR_SLASH)BenchmarkExecutor.$(O) \
     $(OUTDIR_SLASH)BenchmarkInstance.$(O) \
+    $(OUTDIR_SLASH)BenchmarkMeasurement.$(O) \
+    $(OUTDIR_SLASH)BenchmarkMeasurementInstrument.$(O) \
+    $(OUTDIR_SLASH)BenchmarkMeasurementValueNotAvailable.$(O) \
     $(OUTDIR_SLASH)BenchmarkOutcome.$(O) \
     $(OUTDIR_SLASH)BenchmarkParameter.$(O) \
     $(OUTDIR_SLASH)BenchmarkPlatform.$(O) \
@@ -86,7 +95,9 @@
     $(OUTDIR_SLASH)BenchmarkRunner.$(O) \
     $(OUTDIR_SLASH)BenchmarkSuite.$(O) \
     $(OUTDIR_SLASH)jv_calipel_s.$(O) \
+    $(OUTDIR_SLASH)BenchmarkCountingInstrument.$(O) \
     $(OUTDIR_SLASH)BenchmarkExecutionError.$(O) \
+    $(OUTDIR_SLASH)BenchmarkExecutionTimeInstrument.$(O) \
     $(OUTDIR_SLASH)BenchmarkParameterError.$(O) \
     $(OUTDIR_SLASH)BenchmarkReportJSON.$(O) \
     $(OUTDIR_SLASH)BenchmarkReportText.$(O) \
--- a/s/abbrev.stc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/abbrev.stc	Thu Dec 04 00:25:31 2014 +0000
@@ -5,6 +5,9 @@
 BenchmarkError BenchmarkError jv:calipel/s 'CalipeL-S-Core-Exceptions' 1
 BenchmarkExecutor BenchmarkExecutor jv:calipel/s 'CalipeL-S-Core' 0
 BenchmarkInstance BenchmarkInstance jv:calipel/s 'CalipeL-S-Core' 0
+BenchmarkMeasurement BenchmarkMeasurement jv:calipel/s 'CalipeL-S-Core-Measurement' 0
+BenchmarkMeasurementInstrument BenchmarkMeasurementInstrument jv:calipel/s 'CalipeL-S-Core-Measurement' 0
+BenchmarkMeasurementValueNotAvailable BenchmarkMeasurementValueNotAvailable jv:calipel/s 'CalipeL-S-Core-Measurement' 0
 BenchmarkOutcome BenchmarkOutcome jv:calipel/s 'CalipeL-S-Core' 0
 BenchmarkParameter BenchmarkParameter jv:calipel/s 'CalipeL-S-Core' 0
 BenchmarkPlatform BenchmarkPlatform jv:calipel/s 'CalipeL-S-Core' 0
@@ -14,7 +17,9 @@
 BenchmarkRunner BenchmarkRunner jv:calipel/s 'CalipeL-S-Core-Runner' 0
 BenchmarkSuite BenchmarkSuite jv:calipel/s 'CalipeL-S-Core' 0
 jv_calipel_s jv_calipel_s jv:calipel/s '* Projects & Packages *' 3
+BenchmarkCountingInstrument BenchmarkCountingInstrument jv:calipel/s 'CalipeL-S-Core-Measurement' 0
 BenchmarkExecutionError BenchmarkExecutionError jv:calipel/s 'CalipeL-S-Core-Exceptions' 1
+BenchmarkExecutionTimeInstrument BenchmarkExecutionTimeInstrument jv:calipel/s 'CalipeL-S-Core-Measurement' 0
 BenchmarkParameterError BenchmarkParameterError jv:calipel/s 'CalipeL-S-Core-Exceptions' 1
 BenchmarkReportJSON BenchmarkReportJSON jv:calipel/s 'CalipeL-S-Core-Reports' 0
 BenchmarkReportText BenchmarkReportText jv:calipel/s 'CalipeL-S-Core-Reports' 0
--- a/s/bc.mak	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/bc.mak	Thu Dec 04 00:25:31 2014 +0000
@@ -30,6 +30,7 @@
 !INCLUDE Make.spec
 
 LIBNAME=libjv_calipel_s
+MODULE_PATH=calipel\s
 RESFILES=s.$(RES)
 
 
@@ -71,6 +72,9 @@
 $(OUTDIR)BenchmarkError.$(O) BenchmarkError.$(H): BenchmarkError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkExecutor.$(O) BenchmarkExecutor.$(H): BenchmarkExecutor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkInstance.$(O) BenchmarkInstance.$(H): BenchmarkInstance.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurement.$(O) BenchmarkMeasurement.$(H): BenchmarkMeasurement.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurementInstrument.$(O) BenchmarkMeasurementInstrument.$(H): BenchmarkMeasurementInstrument.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMeasurementValueNotAvailable.$(O) BenchmarkMeasurementValueNotAvailable.$(H): BenchmarkMeasurementValueNotAvailable.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkOutcome.$(O) BenchmarkOutcome.$(H): BenchmarkOutcome.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkParameter.$(O) BenchmarkParameter.$(H): BenchmarkParameter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkPlatform.$(O) BenchmarkPlatform.$(H): BenchmarkPlatform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -80,7 +84,9 @@
 $(OUTDIR)BenchmarkRunner.$(O) BenchmarkRunner.$(H): BenchmarkRunner.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkSuite.$(O) BenchmarkSuite.$(H): BenchmarkSuite.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s.$(O) jv_calipel_s.$(H): jv_calipel_s.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkCountingInstrument.$(O) BenchmarkCountingInstrument.$(H): BenchmarkCountingInstrument.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkExecutionError.$(O) BenchmarkExecutionError.$(H): BenchmarkExecutionError.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkExecutionTimeInstrument.$(O) BenchmarkExecutionTimeInstrument.$(H): BenchmarkExecutionTimeInstrument.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkParameterError.$(O) BenchmarkParameterError.$(H): BenchmarkParameterError.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkReportJSON.$(O) BenchmarkReportJSON.$(H): BenchmarkReportJSON.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkReport.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkReportText.$(O) BenchmarkReportText.$(H): BenchmarkReportText.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkReport.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/s/benchmarks/stx/BenchmarkCollection.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/BenchmarkCollection.st	Thu Dec 04 00:25:31 2014 +0000
@@ -73,13 +73,14 @@
 
     collectionDataset1 := (1 to: collectionDatasetSize) collect:[:i | generator value ].
     self assert: seen size = collectionDatasetSize.        
-    collectionDataset2 := nil. "/ unused.
-    collectionDataset3 := nil. "/ unused.
+    collectionDataset2 := nil. 
+    collectionDataset3 := nil.
     Smalltalk garbageCollect.
     collection := nil.
 
     "Created: / 09-03-2014 / 10:10:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 10-03-2014 / 00:17:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 02-12-2014 / 23:56:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
--- a/s/benchmarks/stx/BenchmarkSTX1.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/BenchmarkSTX1.st	Thu Dec 04 00:25:31 2014 +0000
@@ -2170,9 +2170,9 @@
 largeSubtract3
     <benchmark: 'largeInt - smallInt subtraction 1'>
 
-    |t n|
-
-    "/ tests absFastMinus
+    |n|
+
+    "/ tests absFastMinus"
     n := 1000 factorial.
 
         100000 timesRepeat:[
@@ -2200,14 +2200,15 @@
 
     "Modified: / 05-06-1999 / 02:28:18 / cg"
     "Modified: / 24-09-2014 / 21:32:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 02-12-2014 / 23:57:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 largeSubtract3b
     <benchmark: 'largeInt - smallInt subtraction 2'>
 
-    |t n|
-
-    "/ tests absFastPlus
+    |n|
+
+    "/ tests absFastPlus"
     n := 1000 factorial negated.
 
         100000 timesRepeat:[
@@ -2236,6 +2237,7 @@
     "Modified: / 10-08-1999 / 13:28:41 / cg"
     "Modified: / 26-10-1999 / 21:31:05 / stefan"
     "Modified: / 24-09-2014 / 21:32:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 02-12-2014 / 23:57:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 largeSubtract4
@@ -3547,7 +3549,7 @@
     t2 := Time millisecondsToRun:[
         50 timesRepeat:[
             1 to:250 do:[:i | refs at:i put:(ByteArray new:100)].
-            "/ automatically freed
+            "/ automatically freed"
         ]
     ].
 
@@ -3563,6 +3565,8 @@
       2641    3379
         79     142
     "
+
+    "Modified (comment): / 02-12-2014 / 23:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 benchNew2
@@ -5839,27 +5843,6 @@
     "
      Transcript showCR:(Time millisecondsToRun:[STXBenchmarks1 sumTo])
     "
-!
-
-sumTo3
-    "demonstrating inline C advantage ...
-     ... however, be careful, some compilers optimize the whole
-         loop by eliminating it alltogether ..."
-
-%{
-        int i, cnt, val;
-
-        for (cnt=1; cnt<=100; cnt++) {
-            val = 0;
-            for (i=1; i<=10000; i++) {
-                val += i;
-            }
-        }
-%}.
-
-    "
-     Transcript showCR:(Time millisecondsToRun:[STXBenchmarks1 sumTo3])
-    "
 ! !
 
 !BenchmarkSTX1 methodsFor:'benchmarks-standard'!
--- a/s/benchmarks/stx/BenchmarkSmopstone.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/BenchmarkSmopstone.st	Thu Dec 04 00:25:31 2014 +0000
@@ -602,12 +602,14 @@
   [s atEnd] whileFalse:
     [float := 0.
     string := s upTo: $..
-"/    s upTo: space.
+"/    s upTo: space."
     s skipThrough:space.
     "In the following, digitValue is portable between ST80 and ST/V-DOS."
     string do: [:char | float := float * 10.0 + char digitValue].
     floats add: float].
   integers = floats ifFalse: [self halt: 'Numbers do not compare.']
+
+    "Modified (comment): / 02-12-2014 / 23:57:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 stringsUpTo: n
@@ -626,3 +628,10 @@
   ^(1 to: n) collect: [:m | m printString perform: selector]
 ! !
 
+!BenchmarkSmopstone class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/s/benchmarks/stx/BenchmarkSortedCollectionLike.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/BenchmarkSortedCollectionLike.st	Thu Dec 04 00:25:31 2014 +0000
@@ -21,13 +21,17 @@
     coll addAll:randomNumbers.
 
     randomNumbers do:[:each |
-"/        Transcript showCR:'-----------'.
-"/        Transcript showCR:(coll instVarNamed:'treeRoot').
-"/        Transcript showCR:each.
+"       
+        Transcript showCR:'-----------'.
+        Transcript showCR:(coll instVarNamed:'treeRoot').
+        Transcript showCR:each.
+"
         coll remove:each.
         sc remove:each.
         self assert:(sc asOrderedCollection = coll asOrderedCollection).
     ].
+
+    "Modified (format): / 02-12-2014 / 23:58:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkSortedCollectionLike methodsFor:'benchmarks'!
--- a/s/benchmarks/stx/Make.proto	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/Make.proto	Thu Dec 04 00:25:31 2014 +0000
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/jv/calipel/s -I$(INCLUDE_TOP)/stx/libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)/jv/calipel/s -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libview
 
 
 # if you need any additional defines for embedded C code,
--- a/s/benchmarks/stx/Make.spec	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/Make.spec	Thu Dec 04 00:25:31 2014 +0000
@@ -42,6 +42,7 @@
 #  -warnNonStandard : no warnings about ST/X extensions
 #  -warnEOLComments : no warnings about EOL comment extension
 #  -warnPrivacy     : no warnings about privateClass extension
+#  -warnUnused      : no warnings about unused variables
 #
 # ********** OPTIONAL: MODIFY the next line(s) ***
 # STCWARNINGS=-warn
--- a/s/benchmarks/stx/bc.mak	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/bc.mak	Thu Dec 04 00:25:31 2014 +0000
@@ -30,11 +30,12 @@
 !INCLUDE Make.spec
 
 LIBNAME=libjv_calipel_s_benchmarks_stx
+MODULE_PATH=calipel\s\benchmarks\stx
 RESFILES=stx.$(RES)
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\jv\calipel\s -I$(INCLUDE_TOP)\stx\libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)\jv\calipel\s -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libview
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
--- a/s/benchmarks/stx/stx.rc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/benchmarks/stx/stx.rc	Thu Dec 04 00:25:31 2014 +0000
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,3,0
+  PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:calipel/s/benchmarks/stx\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
-      VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Wed, 12 Mar 2014 18:40:43 GMT\0"
+      VALUE "ProductVersion", "6.2.5.0\0"
+      VALUE "ProductDate", "Wed, 03 Dec 2014 00:01:16 GMT\0"
     END
 
   END
--- a/s/jv_calipel_s.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/jv_calipel_s.st	Thu Dec 04 00:25:31 2014 +0000
@@ -36,12 +36,12 @@
     "list packages which are mandatory as a prerequisite.
      This are packages containing superclasses of my classes and classes which
      are extended by myself.
-     They are mandatory, beacuse we need these packages as a prerequisite for loading and compiling.
+     They are mandatory, because we need these packages as a prerequisite for loading and compiling.
      This method is generated automatically,
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:libbasic'    "Error - superclass of BenchmarkError "
+        #'stx:libbasic'    "Error - superclass of BenchmarkError"
     )
 !
 
@@ -53,8 +53,8 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'stx:libbasic3'    "MessageTally - referenced by BenchmarkInstance>>spyIt "
-        #'stx:libcompat'    "DateAndTime - referenced by BenchmarkResult>>initializeTimestamp "
+        #'stx:libbasic3'    "MessageTally - referenced by BenchmarkInstance>>spyIt"
+        #'stx:libcompat'    "DateAndTime - referenced by BenchmarkResult>>initializeTimestamp"
     )
 !
 
@@ -96,6 +96,9 @@
         BenchmarkError
         BenchmarkExecutor
         BenchmarkInstance
+        BenchmarkMeasurement
+        BenchmarkMeasurementInstrument
+        BenchmarkMeasurementValueNotAvailable
         BenchmarkOutcome
         BenchmarkParameter
         BenchmarkPlatform
@@ -105,7 +108,9 @@
         BenchmarkRunner
         BenchmarkSuite
         #'jv_calipel_s'
+        BenchmarkCountingInstrument
         BenchmarkExecutionError
+        BenchmarkExecutionTimeInstrument
         BenchmarkParameterError
         BenchmarkReportJSON
         BenchmarkReportText
--- a/s/libInit.cc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/libInit.cc	Thu Dec 04 00:25:31 2014 +0000
@@ -31,6 +31,9 @@
 _BenchmarkError_Init(pass,__pRT__,snd);
 _BenchmarkExecutor_Init(pass,__pRT__,snd);
 _BenchmarkInstance_Init(pass,__pRT__,snd);
+_BenchmarkMeasurement_Init(pass,__pRT__,snd);
+_BenchmarkMeasurementInstrument_Init(pass,__pRT__,snd);
+_BenchmarkMeasurementValueNotAvailable_Init(pass,__pRT__,snd);
 _BenchmarkOutcome_Init(pass,__pRT__,snd);
 _BenchmarkParameter_Init(pass,__pRT__,snd);
 _BenchmarkPlatform_Init(pass,__pRT__,snd);
@@ -40,7 +43,9 @@
 _BenchmarkRunner_Init(pass,__pRT__,snd);
 _BenchmarkSuite_Init(pass,__pRT__,snd);
 _jv_137calipel_137s_Init(pass,__pRT__,snd);
+_BenchmarkCountingInstrument_Init(pass,__pRT__,snd);
 _BenchmarkExecutionError_Init(pass,__pRT__,snd);
+_BenchmarkExecutionTimeInstrument_Init(pass,__pRT__,snd);
 _BenchmarkParameterError_Init(pass,__pRT__,snd);
 _BenchmarkReportJSON_Init(pass,__pRT__,snd);
 _BenchmarkReportText_Init(pass,__pRT__,snd);
--- a/s/s.rc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/s.rc	Thu Dec 04 00:25:31 2014 +0000
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,4,0
+  PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:calipel/s\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
-      VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Tue, 30 Sep 2014 09:05:07 GMT\0"
+      VALUE "ProductVersion", "6.2.5.0\0"
+      VALUE "ProductDate", "Mon, 01 Dec 2014 03:08:52 GMT\0"
     END
 
   END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/stx/BenchmarkMarkAndSweepCountInstrument.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,55 @@
+"{ Package: 'jv:calipel/s/stx' }"
+
+BenchmarkCountingInstrument subclass:#BenchmarkMarkAndSweepCountInstrument
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Smalltalk/X-Measurement'
+!
+
+
+!BenchmarkMarkAndSweepCountInstrument methodsFor:'accessing'!
+
+measurementInstrumentName
+    "Returns a human-readable name of this instrument"
+    
+    ^ '# of M&S GCs'
+
+    "Created: / 01-12-2014 / 02:36:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+name
+    "Returns a human-readable name of this instrument"
+
+    ^ '# of M&S GCs'
+
+    "Created: / 27-11-2014 / 12:44:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMarkAndSweepCountInstrument methodsFor:'measurement'!
+
+measurementStart:aBenchmarkInstance 
+    ObjectMemory garbageCollect.
+    ^ super measurementStart:aBenchmarkInstance
+
+    "Created: / 27-11-2014 / 13:33:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-12-2014 / 02:44:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMarkAndSweepCountInstrument methodsFor:'private'!
+
+getCounterValue
+    "superclass BenchmarkCountingInstrument says that I am responsible to implement this method"
+
+    ^ ObjectMemory markAndSweepCount
+
+    "Created: / 27-11-2014 / 12:45:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkMarkAndSweepCountInstrument class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/s/stx/BenchmarkPlatformStX.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/BenchmarkPlatformStX.st	Thu Dec 04 00:25:31 2014 +0000
@@ -115,6 +115,20 @@
     "Created: / 06-06-2013 / 09:14:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkPlatformStX methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    super initialize.
+    instruments := Array 
+                    with: BenchmarkExecutionTimeInstrument new
+                    with: BenchmarkScavengeCountInstrument new
+                    with: BenchmarkMarkAndSweepCountInstrument new
+
+    "Created: / 27-11-2014 / 13:42:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkPlatformStX methodsFor:'queries'!
 
 isHeadless
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/stx/BenchmarkScavengeCountInstrument.st	Thu Dec 04 00:25:31 2014 +0000
@@ -0,0 +1,53 @@
+"{ Package: 'jv:calipel/s/stx' }"
+
+BenchmarkCountingInstrument subclass:#BenchmarkScavengeCountInstrument
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Smalltalk/X-Measurement'
+!
+
+
+!BenchmarkScavengeCountInstrument methodsFor:'accessing'!
+
+measurementInstrumentName
+    "Returns a human-readable name of this instrument"
+    
+    ^ '# of newspace GCs'
+
+    "Created: / 01-12-2014 / 02:36:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+name
+    "Returns a human-readable name of this instrument"
+
+    ^ '# of newspace GCs'
+
+    "Created: / 27-11-2014 / 12:40:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkScavengeCountInstrument methodsFor:'measurement'!
+
+measurementStart:aBenchmarkInstance 
+    ObjectMemory scavenge.
+    ^ super measurementStart:aBenchmarkInstance
+
+    "Created: / 27-11-2014 / 13:33:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-12-2014 / 02:44:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkScavengeCountInstrument methodsFor:'private'!
+
+getCounterValue
+    ^ ObjectMemory scavengeCount
+
+    "Created: / 27-11-2014 / 12:43:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkScavengeCountInstrument class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/s/stx/Make.proto	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/Make.proto	Thu Dec 04 00:25:31 2014 +0000
@@ -122,8 +122,10 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)BenchmarkMarkAndSweepCountInstrument.$(O) BenchmarkMarkAndSweepCountInstrument.$(H): BenchmarkMarkAndSweepCountInstrument.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkCountingInstrument.$(H) $(INCLUDE_TOP)/jv/calipel/s/BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkPlatformStX.$(O) BenchmarkPlatformStX.$(H): BenchmarkPlatformStX.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkPlatform.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkRunnerAdapterStX.$(O) BenchmarkRunnerAdapterStX.$(H): BenchmarkRunnerAdapterStX.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/StandaloneStartup.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkScavengeCountInstrument.$(O) BenchmarkScavengeCountInstrument.$(H): BenchmarkScavengeCountInstrument.st $(INCLUDE_TOP)/jv/calipel/s/BenchmarkCountingInstrument.$(H) $(INCLUDE_TOP)/jv/calipel/s/BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s_stx.$(O) jv_calipel_s_stx.$(H): jv_calipel_s_stx.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/s/stx/Make.spec	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/Make.spec	Thu Dec 04 00:25:31 2014 +0000
@@ -42,6 +42,7 @@
 #  -warnNonStandard : no warnings about ST/X extensions
 #  -warnEOLComments : no warnings about EOL comment extension
 #  -warnPrivacy     : no warnings about privateClass extension
+#  -warnUnused      : no warnings about unused variables
 #
 # ********** OPTIONAL: MODIFY the next line(s) ***
 # STCWARNINGS=-warn
@@ -50,16 +51,20 @@
 STCWARNINGS=-warnNonStandard
 
 COMMON_CLASSES= \
+	BenchmarkMarkAndSweepCountInstrument \
 	BenchmarkPlatformStX \
 	BenchmarkRunnerAdapterStX \
+	BenchmarkScavengeCountInstrument \
 	jv_calipel_s_stx \
 
 
 
 
 COMMON_OBJS= \
+    $(OUTDIR_SLASH)BenchmarkMarkAndSweepCountInstrument.$(O) \
     $(OUTDIR_SLASH)BenchmarkPlatformStX.$(O) \
     $(OUTDIR_SLASH)BenchmarkRunnerAdapterStX.$(O) \
+    $(OUTDIR_SLASH)BenchmarkScavengeCountInstrument.$(O) \
     $(OUTDIR_SLASH)jv_calipel_s_stx.$(O) \
 
 
--- a/s/stx/abbrev.stc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/abbrev.stc	Thu Dec 04 00:25:31 2014 +0000
@@ -1,6 +1,8 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
+BenchmarkMarkAndSweepCountInstrument BenchmarkMarkAndSweepCountInstrument jv:calipel/s/stx 'CalipeL-S-Smalltalk/X-Measurement' 0
 BenchmarkPlatformStX BenchmarkPlatformStX jv:calipel/s/stx 'CalipeL-S-Smalltalk/X' 0
 BenchmarkRunnerAdapterStX BenchmarkRunnerAdapterStX jv:calipel/s/stx 'CalipeL-S-Smalltalk/X' 2
+BenchmarkScavengeCountInstrument BenchmarkScavengeCountInstrument jv:calipel/s/stx 'CalipeL-S-Smalltalk/X-Measurement' 0
 jv_calipel_s_stx jv_calipel_s_stx jv:calipel/s/stx '* Projects & Packages *' 3
--- a/s/stx/bc.mak	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/bc.mak	Thu Dec 04 00:25:31 2014 +0000
@@ -30,6 +30,7 @@
 !INCLUDE Make.spec
 
 LIBNAME=libjv_calipel_s_stx
+MODULE_PATH=calipel\s\stx
 RESFILES=stx.$(RES)
 
 
@@ -68,8 +69,10 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)BenchmarkMarkAndSweepCountInstrument.$(O) BenchmarkMarkAndSweepCountInstrument.$(H): BenchmarkMarkAndSweepCountInstrument.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkCountingInstrument.$(H) $(INCLUDE_TOP)\jv\calipel\s\BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkPlatformStX.$(O) BenchmarkPlatformStX.$(H): BenchmarkPlatformStX.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkPlatform.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)BenchmarkRunnerAdapterStX.$(O) BenchmarkRunnerAdapterStX.$(H): BenchmarkRunnerAdapterStX.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\StandaloneStartup.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkScavengeCountInstrument.$(O) BenchmarkScavengeCountInstrument.$(H): BenchmarkScavengeCountInstrument.st $(INCLUDE_TOP)\jv\calipel\s\BenchmarkCountingInstrument.$(H) $(INCLUDE_TOP)\jv\calipel\s\BenchmarkMeasurementInstrument.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_calipel_s_stx.$(O) jv_calipel_s_stx.$(H): jv_calipel_s_stx.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/s/stx/jv_calipel_s_stx.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/jv_calipel_s_stx.st	Thu Dec 04 00:25:31 2014 +0000
@@ -22,13 +22,13 @@
     "list packages which are mandatory as a prerequisite.
      This are packages containing superclasses of my classes and classes which
      are extended by myself.
-     They are mandatory, beacuse we need these packages as a prerequisite for loading and compiling.
+     They are mandatory, because we need these packages as a prerequisite for loading and compiling.
      This method is generated automatically,
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'jv:calipel/s'    "BenchmarkPlatform - superclass of BenchmarkPlatformStX "
-        #'stx:libbasic'    "LibraryDefinition - superclass of jv_calipel_s_stx "
+        #'jv:calipel/s'    "BenchmarkCountingInstrument - superclass of BenchmarkMarkAndSweepCountInstrument"
+        #'stx:libbasic'    "LibraryDefinition - superclass of jv_calipel_s_stx"
     )
 !
 
@@ -40,8 +40,8 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'stx:libbasic2'    "UUID - referenced by BenchmarkRunnerAdapterStX class>>applicationUUID "
-        #'stx:libjava'    "JavaNativeMethod - referenced by BenchmarkPlatformStX class>>initialize "
+        #'stx:libbasic2'    "UUID - referenced by BenchmarkRunnerAdapterStX class>>applicationUUID"
+        #'stx:libjava'    "JavaNativeMethod - referenced by BenchmarkRunnerAdapterStX class>>setupForPerformance"
     )
 !
 
@@ -65,8 +65,10 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
+        BenchmarkMarkAndSweepCountInstrument
         BenchmarkPlatformStX
         BenchmarkRunnerAdapterStX
+        BenchmarkScavengeCountInstrument
         #'jv_calipel_s_stx'
     )
 !
--- a/s/stx/libInit.cc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/libInit.cc	Thu Dec 04 00:25:31 2014 +0000
@@ -27,8 +27,10 @@
 void _libjv_calipel_s_stx_Init(pass, __pRT__, snd)
 OBJ snd; struct __vmData__ *__pRT__; {
 __BEGIN_PACKAGE2__("libjv_calipel_s_stx", _libjv_calipel_s_stx_Init, "jv:calipel/s/stx");
+_BenchmarkMarkAndSweepCountInstrument_Init(pass,__pRT__,snd);
 _BenchmarkPlatformStX_Init(pass,__pRT__,snd);
 _BenchmarkRunnerAdapterStX_Init(pass,__pRT__,snd);
+_BenchmarkScavengeCountInstrument_Init(pass,__pRT__,snd);
 _jv_137calipel_137s_137stx_Init(pass,__pRT__,snd);
 
 
--- a/s/stx/stx.rc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/stx/stx.rc	Thu Dec 04 00:25:31 2014 +0000
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,4,0
+  PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:calipel/s/stx\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "ProductName\0"
-      VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Tue, 30 Sep 2014 09:05:10 GMT\0"
+      VALUE "ProductVersion", "6.2.5.0\0"
+      VALUE "ProductDate", "Mon, 01 Dec 2014 03:08:55 GMT\0"
     END
 
   END
--- a/s/tests/BenchmarkInstanceTestsA.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/BenchmarkInstanceTestsA.st	Thu Dec 04 00:25:31 2014 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'jv:calipel/s/tests' }"
 
 TestCase subclass:#BenchmarkInstanceTestsA
-	instanceVariableNames:'log param1 param2'
+	instanceVariableNames:'log param1 param2 measurementValue'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'CalipeL-S-Tests'
@@ -90,6 +90,36 @@
     "Created: / 09-03-2014 / 22:52:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!BenchmarkInstanceTestsA methodsFor:'instrument mimicry'!
+
+measurementInstrumentName
+    ^ self name
+
+    "Created: / 01-12-2014 / 02:38:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementStart:anObject 
+    "void"
+    "Created: / 28-11-2014 / 00:00:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementStop:anObject 
+    "void"
+    "Created: / 28-11-2014 / 00:00:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementUnit
+    ^ '1'
+
+    "Created: / 28-11-2014 / 00:26:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+measurementValue
+    ^ measurementValue
+
+    "Created: / 01-12-2014 / 02:47:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !BenchmarkInstanceTestsA methodsFor:'parameters'!
 
 param1
@@ -120,8 +150,10 @@
 
 setUp
     log := OrderedCollection new.
+    measurementValue := 9999
 
     "Created: / 27-05-2013 / 22:08:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 01-12-2014 / 02:55:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkInstanceTestsA methodsFor:'tests'!
@@ -135,10 +167,14 @@
 
     self assert: r outcomes size == 1.
     self assert: r outcomes anyOne benchmark == b.
+    self assert: r outcomes anyOne measurements size == 1.
+    self assert: r outcomes anyOne measurements anyOne size == BenchmarkPlatform current instruments size.
+    self assert: (r outcomes anyOne measurements anyOne allSatisfy:[:each | BenchmarkPlatform current instruments includes: each instrument ]).
+
     self assert: log asArray = #(#fakeSetUp #fake01 "<--warmup" #fakeSetUp #fake01 ).
 
     "Created: / 27-05-2013 / 22:08:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 10-03-2014 / 10:13:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 27-11-2014 / 23:58:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_02
@@ -317,6 +353,43 @@
 
     "Created: / 09-03-2014 / 23:36:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 10-03-2014 / 10:14:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_07a
+    "Tests custom instrument"
+
+    | b r |
+
+    b := BenchmarkInstance new instance:self selector:#'fake04b'.
+    r := b run: BenchmarkResult new with: Dictionary new executor: (BenchmarkExecutor new instruments: (Array with: self)).
+
+    self assert: r outcomes anyOne measurements size == 1.
+    self assert: r outcomes anyOne measurements anyOne size == (BenchmarkPlatform current instruments size + 1).
+    self assert: (r outcomes anyOne measurements anyOne contains:[:e | e instrument == self]).
+
+    self assert: log asArray = #(#fakeSetUp #fake03 #fakeTearDown1 #fakeTearDown2"<--warmaup" #fakeSetUp #fake03 #fakeTearDown1 #fakeTearDown2)
+
+    "Created: / 27-11-2014 / 23:58:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_07b
+    "Tests custom instrument"
+
+    | b r |
+
+    measurementValue := BenchmarkMeasurementValueNotAvailable instance.
+    b := BenchmarkInstance new instance:self selector:#'fake04b'.
+    r := b run: BenchmarkResult new with: Dictionary new executor: (BenchmarkExecutor new instruments: (Array with: self)).
+
+    self assert: r outcomes anyOne measurements size == 1.
+    self assert: r outcomes anyOne measurements anyOne size == (BenchmarkPlatform current instruments size + 1).
+    self assert: (r outcomes anyOne measurements anyOne contains:[:e | e instrument == self]).
+
+    self assert: log asArray = #(#fakeSetUp #fake03 #fakeTearDown1 #fakeTearDown2"<--warmaup" #fakeSetUp #fake03 #fakeTearDown1 #fakeTearDown2).
+
+    String streamContents: [:s | BenchmarkReport text write: r on: s ]
+
+    "Created: / 01-12-2014 / 02:57:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkInstanceTestsA class methodsFor:'documentation'!
--- a/s/tests/BenchmarkRunnerTests.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/BenchmarkRunnerTests.st	Thu Dec 04 00:25:31 2014 +0000
@@ -195,8 +195,8 @@
     runner main: (Array with:'--arguments' with: file pathName).
 
     self assert: runner result outcomes size = 1.
-    self assert: runner result outcomes anElement times size = 5.
-    self assert: runner result outcomes anElement times first < 200.
+    self assert: runner result outcomes anyOne times size = 5.
+    self assert: runner result outcomes anyOne times first < 200.
 
     ] ensure:[
         file remove
@@ -223,8 +223,8 @@
     runner main: (Array with:'--script' with: file pathName).
 
     self assert: runner result outcomes size = 1.
-    self assert: runner result outcomes anElement times size = 5.
-    self assert: runner result outcomes anElement times first < 200.
+    self assert: runner result outcomes anyOne times size = 5.
+    self assert: runner result outcomes anyOne times first < 200.
 
     ] ensure:[
         file remove
@@ -362,6 +362,38 @@
     self assert: argv asArray = #('Suite1#bench1')
 
     "Created: / 08-03-2014 / 15:57:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_basic_07a
+    "Test custom instruments"
+
+    | runner |
+
+    runner := BenchmarkRunner new.
+    runner main: #('-i' 'BenchmarkInstanceTestsA' 'BenchmarkTestsSuiteA').
+
+    self assert: runner result outcomes size = 2.
+    self assert: runner result outcomes anyOne measurements size == 5.
+    self assert: runner result outcomes anyOne measurements anyOne size == (BenchmarkPlatform current instruments size + 1).
+    self assert: (runner result outcomes anyOne measurements anyOne contains:[:e | e instrument class == BenchmarkInstanceTestsA ]).
+
+    "Created: / 28-11-2014 / 00:05:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_basic_07b
+    "Test custom instruments"
+
+    | runner |
+
+    runner := BenchmarkRunner new.
+    runner main: #('--instrument' 'BenchmarkInstanceTestsA' 'BenchmarkTestsSuiteA').
+
+    self assert: runner result outcomes size = 2.
+    self assert: runner result outcomes anyOne measurements size == 5.
+    self assert: runner result outcomes anyOne measurements anyOne size == (BenchmarkPlatform current instruments size + 1).
+    self assert: (runner result outcomes anyOne measurements anyOne contains:[:e | e instrument class == BenchmarkInstanceTestsA ]).
+
+    "Created: / 28-11-2014 / 00:17:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !BenchmarkRunnerTests class methodsFor:'documentation'!
--- a/s/tests/Make.spec	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/Make.spec	Thu Dec 04 00:25:31 2014 +0000
@@ -42,6 +42,7 @@
 #  -warnNonStandard : no warnings about ST/X extensions
 #  -warnEOLComments : no warnings about EOL comment extension
 #  -warnPrivacy     : no warnings about privateClass extension
+#  -warnUnused      : no warnings about unused variables
 #
 # ********** OPTIONAL: MODIFY the next line(s) ***
 # STCWARNINGS=-warn
--- a/s/tests/bc.mak	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/bc.mak	Thu Dec 04 00:25:31 2014 +0000
@@ -30,6 +30,7 @@
 !INCLUDE Make.spec
 
 LIBNAME=libjv_calipel_s_tests
+MODULE_PATH=calipel\s\tests
 RESFILES=tests.$(RES)
 
 
--- a/s/tests/jv_calipel_s_tests.st	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/jv_calipel_s_tests.st	Thu Dec 04 00:25:31 2014 +0000
@@ -22,13 +22,13 @@
     "list packages which are mandatory as a prerequisite.
      This are packages containing superclasses of my classes and classes which
      are extended by myself.
-     They are mandatory, beacuse we need these packages as a prerequisite for loading and compiling.
+     They are mandatory, because we need these packages as a prerequisite for loading and compiling.
      This method is generated automatically,
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:goodies/sunit'    "TestAsserter - superclass of BenchmarkInstanceTestsA "
-        #'stx:libbasic'    "LibraryDefinition - superclass of jv_calipel_s_tests "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of BenchmarkInstanceTestsA"
+        #'stx:libbasic'    "LibraryDefinition - superclass of jv_calipel_s_tests"
     )
 !
 
@@ -40,7 +40,7 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'jv:calipel/s'    "BenchmarkExecutionError - referenced by BenchmarkRunnerTests>>test_basic_03a "
+        #'jv:calipel/s'    "BenchmarkExecutionError - referenced by BenchmarkRunnerTests>>test_basic_03a"
     )
 !
 
--- a/s/tests/tests.rc	Thu Dec 04 00:12:57 2014 +0000
+++ b/s/tests/tests.rc	Thu Dec 04 00:25:31 2014 +0000
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,4,0
+  PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:calipel/s/tests\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "ProductName\0"
-      VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Tue, 30 Sep 2014 09:05:08 GMT\0"
+      VALUE "ProductVersion", "6.2.5.0\0"
+      VALUE "ProductDate", "Tue, 02 Dec 2014 23:33:46 GMT\0"
     END
 
   END