From b2d7da16e9fcae14a9d1bf3ff13793df16131509 Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Sun, 15 Jun 2014 01:44:51 +0200
Subject: [PATCH] modified some performance tests

---
 .../java/teetime/util/StatisticsUtil.java     |  4 ++--
 ...odCallThoughputTimestampAnalysis7Test.java |  1 -
 .../MethodCallThroughputAnalysis3.java        | 19 ++++++++++++-------
 .../MethodCallThroughputAnalysis7.java        | 17 ++++++++++++++---
 .../throughput/methodcall/NoopFilter.java     |  1 +
 5 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/src/main/java/teetime/util/StatisticsUtil.java b/src/main/java/teetime/util/StatisticsUtil.java
index 00e2b16f..cd0e3d43 100644
--- a/src/main/java/teetime/util/StatisticsUtil.java
+++ b/src/main/java/teetime/util/StatisticsUtil.java
@@ -27,7 +27,7 @@ import teetime.examples.throughput.TimestampObject;
 
 /**
  * @author Christian Wulf
- *
+ * 
  * @since 1.10
  */
 public class StatisticsUtil {
@@ -72,7 +72,7 @@ public class StatisticsUtil {
 
 	public static void printQuintiles(final Map<Double, Long> quintileValues) {
 		for (final Entry<Double, Long> entry : quintileValues.entrySet()) {
-			System.out.println((entry.getKey() * 100) + " % : " + TimeUnit.NANOSECONDS.toMicros(entry.getValue()) + " µs");
+			System.out.println((entry.getKey() * 100) + " % : " + TimeUnit.NANOSECONDS.toNanos(entry.getValue()) + " ns");
 		}
 	}
 
diff --git a/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
index 7d816c11..ef511bb5 100644
--- a/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
+++ b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
@@ -22,7 +22,6 @@ import java.util.concurrent.Callable;
 import org.junit.Before;
 import org.junit.Test;
 
-import teetime.examples.throughput.methodcall.MethodCallThroughputAnalysis6;
 import teetime.examples.throughput.methodcall.MethodCallThroughputAnalysis7;
 import teetime.util.StatisticsUtil;
 import teetime.util.StopWatch;
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
index c627098a..29b7a0ab 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
@@ -78,15 +78,20 @@ public class MethodCallThroughputAnalysis3 extends Analysis {
 			@Override
 			public boolean execute() {
 				// extracting the null-check does NOT improve performance
-				Stage stage = stages[0];
-				Object element = stage.execute(null);
-				if (element == null) {
-					return false;
-				}
+				// Stage stage = stages[0];
+				// Object element = stage.execute(null);
+				// if (element == null) {
+				// return false;
+				// }
+
+				Object element = null;
 
-				for (int i = 1; i < stages.length; i++) {
-					stage = stages[i];
+				for (int i = 0; i < stages.length; i++) {
+					Stage stage = stages[i];
 					element = stage.execute(element);
+					if (element == null) {
+						return false;
+					}
 				}
 
 				return true;
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java
index 965a101b..b9e4060e 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java
@@ -64,7 +64,7 @@ public class MethodCallThroughputAnalysis7 extends Analysis {
 		final StopTimestampFilter stopTimestampFilter = new StopTimestampFilter();
 		final CollectorSink<TimestampObject> collectorSink = new CollectorSink<TimestampObject>(this.timestampObjects);
 
-		final List<Stage> stageList = new ArrayList<Stage>();
+		final List<AbstractStage> stageList = new ArrayList<AbstractStage>();
 		stageList.add(objectProducer);
 		stageList.add(startTimestampFilter);
 		stageList.addAll(Arrays.asList(noopFilters));
@@ -72,19 +72,30 @@ public class MethodCallThroughputAnalysis7 extends Analysis {
 		stageList.add(collectorSink);
 
 		// using an array decreases the performance from 60ms to 200ms (by 3x)
-		final Stage[] stages = stageList.toArray(new Stage[0]);
+		final AbstractStage[] stages = stageList.toArray(new AbstractStage[0]);
 
 		final WrappingPipeline pipeline = new WrappingPipeline() {
 			@Override
 			public boolean execute() {
 				// using the foreach for arrays (i.e., w/o using an iterator variable) increases the performance from 200ms to 130ms
 				Object element = null;
-				for (Stage stage : stages) {
+				for (AbstractStage stage : stages) {
 					element = stage.execute(element);
 					if (element == null) {
 						return false;
 					}
 				}
+
+				// changing the type of stages decreases performance by 2 (e.g., NoopFilter -> Stage)
+				// the VM seems to not optimize the code anymore if the concrete type is not declared
+
+				// for (final NoopFilter<TimestampObject> noopFilter : noopFilters) {
+				// element = noopFilter.execute(element);
+				// }
+				//
+				// element = stopTimestampFilter.execute(element);
+				// element = collectorSink.execute(element);
+
 				return true;
 			}
 
diff --git a/src/test/java/teetime/examples/throughput/methodcall/NoopFilter.java b/src/test/java/teetime/examples/throughput/methodcall/NoopFilter.java
index a62cdbe4..f1d1367e 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/NoopFilter.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/NoopFilter.java
@@ -24,6 +24,7 @@ import teetime.util.list.CommittableQueue;
  */
 public class NoopFilter<T> extends ConsumerStage<T, T> {
 
+	@SuppressWarnings("unchecked")
 	@Override
 	public T execute(final Object obj) {
 		return (T) obj;
-- 
GitLab