From 8b41ea4270402c8b098e7a13366b896b5dd79a93 Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Tue, 3 Jun 2014 22:18:20 +0200
Subject: [PATCH] added StopWatchTest
---
.../ThroughputTimestampAnalysis.java | 15 +++++---
.../framework/concurrent/WorkerThread.java | 22 +++++------
.../java/teetime/util/StatisticsUtil.java | 10 +++--
.../ThroughputTimestampAnalysisTest.java | 6 +--
src/test/java/teetime/util/StopWatchTest.java | 37 +++++++++++++++++++
5 files changed, 67 insertions(+), 23 deletions(-)
create mode 100644 src/test/java/teetime/util/StopWatchTest.java
diff --git a/src/main/java/teetime/examples/throughput/ThroughputTimestampAnalysis.java b/src/main/java/teetime/examples/throughput/ThroughputTimestampAnalysis.java
index 178d35f6..4c813011 100644
--- a/src/main/java/teetime/examples/throughput/ThroughputTimestampAnalysis.java
+++ b/src/main/java/teetime/examples/throughput/ThroughputTimestampAnalysis.java
@@ -38,7 +38,7 @@ import teetime.stage.basic.ObjectProducer;
/**
* @author Christian Wulf
- *
+ *
* @since 1.10
*/
public class ThroughputTimestampAnalysis extends Analysis {
@@ -74,7 +74,8 @@ public class ThroughputTimestampAnalysis extends Analysis {
@SuppressWarnings("unchecked")
final NoopFilter<TimestampObject>[] noopFilters = new NoopFilter[numNoopFilters];
// create stages
- final ObjectProducer<TimestampObject> objectProducer = new ObjectProducer<TimestampObject>(this.numInputObjects, this.inputObjectCreator);
+ final ObjectProducer<TimestampObject> objectProducer = new ObjectProducer<TimestampObject>(
+ this.numInputObjects, this.inputObjectCreator);
final StartTimestampFilter startTimestampFilter = new StartTimestampFilter();
for (int i = 0; i < noopFilters.length; i++) {
noopFilters[i] = new NoopFilter<TimestampObject>();
@@ -133,10 +134,12 @@ public class ThroughputTimestampAnalysis extends Analysis {
final long schedulingOverheadInNs = this.workerThread.computeSchedulingOverheadInNs();
final int size = this.workerThread.getSchedulingOverheadsInNs().size();
System.out.println("scheduling overhead times: " + size);
- System.out.println("SchedulingOverhead: " + TimeUnit.NANOSECONDS.toMillis(schedulingOverheadInNs) + " ms");
- System.out.println("avg overhead of iteration: "
- + TimeUnit.NANOSECONDS.toMillis(schedulingOverheadInNs / (size / 2)) + " ms");
- System.out.println("ExecutedUnsuccessfullyCount: " + this.workerThread.getExecutedUnsuccessfullyCount());
+ if (size > 0) {
+ System.out.println("SchedulingOverhead: " + TimeUnit.NANOSECONDS.toMillis(schedulingOverheadInNs) + " ms");
+ System.out.println("avg overhead of iteration: "
+ + TimeUnit.NANOSECONDS.toMillis(schedulingOverheadInNs * 2 / size) + " ms");
+ System.out.println("ExecutedUnsuccessfullyCount: " + this.workerThread.getExecutedUnsuccessfullyCount());
+ }
}
public int getNumNoopFilters() {
diff --git a/src/main/java/teetime/framework/concurrent/WorkerThread.java b/src/main/java/teetime/framework/concurrent/WorkerThread.java
index db5abd01..61181fc1 100644
--- a/src/main/java/teetime/framework/concurrent/WorkerThread.java
+++ b/src/main/java/teetime/framework/concurrent/WorkerThread.java
@@ -25,7 +25,7 @@ import teetime.util.StopWatch;
/**
* @author Christian Wulf
- *
+ *
* @since 1.10
*/
public class WorkerThread extends Thread {
@@ -64,7 +64,7 @@ public class WorkerThread extends Thread {
while (this.stageScheduler.isAnyStageActive()) {
iterations++;
- this.iterationStopWatch.start();
+// this.iterationStopWatch.start();
final IStage stage = this.stageScheduler.get();
@@ -77,13 +77,13 @@ public class WorkerThread extends Thread {
}
this.stageScheduler.determineNextStage(stage, executedSuccessfully);
- this.iterationStopWatch.end();
- final long schedulingOverhead = this.iterationStopWatch.getDurationInNs() - stage.getLastDuration();
- schedulingOverheadInNs += schedulingOverhead;
- if ((iterations % 10000) == 0) {
- this.schedulingOverheadsInNs.add(schedulingOverheadInNs);
- schedulingOverheadInNs = 0;
- }
+// this.iterationStopWatch.end();
+// final long schedulingOverhead = this.iterationStopWatch.getDurationInNs() - stage.getLastDuration();
+// schedulingOverheadInNs += schedulingOverhead;
+// if ((iterations % 10000) == 0) {
+// this.schedulingOverheadsInNs.add(schedulingOverheadInNs);
+// schedulingOverheadInNs = 0;
+// }
}
this.stopWatch.end();
@@ -165,7 +165,7 @@ public class WorkerThread extends Thread {
/**
* If not set, this thread will run infinitely.
- *
+ *
* @param terminationPolicyToUse
*/
public void setTerminationPolicy(final StageTerminationPolicy terminationPolicyToUse) {
@@ -190,7 +190,7 @@ public class WorkerThread extends Thread {
/**
* Uses the last half of values to compute the scheduling overall overhead in ns
- *
+ *
* @since 1.10
*/
public long computeSchedulingOverheadInNs() {
diff --git a/src/main/java/teetime/util/StatisticsUtil.java b/src/main/java/teetime/util/StatisticsUtil.java
index dce702c4..6c664294 100644
--- a/src/main/java/teetime/util/StatisticsUtil.java
+++ b/src/main/java/teetime/util/StatisticsUtil.java
@@ -67,9 +67,7 @@ public class StatisticsUtil {
final long avgDurInNs = sumInNs / (timestampObjects.size() / 2);
System.out.println("avg duration: " + TimeUnit.NANOSECONDS.toMicros(avgDurInNs) + " µs");
- for (final Entry<Double, Long> entry : quintileValues.entrySet()) {
- System.out.println((entry.getKey() * 100) + " % : " + TimeUnit.NANOSECONDS.toMicros(entry.getValue()) + " µs");
- }
+ printQuintiles(quintileValues);
final long confidenceWidthInNs = StatisticsUtil.calculateConfidenceWidth(sortedDurationsInNs, avgDurInNs);
@@ -78,6 +76,12 @@ public class StatisticsUtil {
+ TimeUnit.NANOSECONDS.toMicros(avgDurInNs + confidenceWidthInNs) + " µs]");
}
+ 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");
+ }
+ }
+
public static long calculateConfidenceWidth(final List<Long> durations, final long avgDurInNs) {
final double z = 1.96; // for alpha = 0.05
final double variance = MathUtil.getVariance(durations, avgDurInNs);
diff --git a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
index d940bd1b..d134990f 100644
--- a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
+++ b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
@@ -29,12 +29,12 @@ import teetime.util.StopWatch;
/**
* @author Christian Wulf
- *
+ *
* @since 1.10
*/
public class ThroughputTimestampAnalysisTest {
- private static final int NUM_OBJECTS_TO_CREATE = 100000;
+ private static final int NUM_OBJECTS_TO_CREATE = 50000;
@Before
public void before() {
@@ -49,7 +49,7 @@ public class ThroughputTimestampAnalysisTest {
* <li>SchedulingOverhead: 12629 ms
* <li>ExecutedUnsuccessfullyCount: 80300001
* </ul>
- *
+ *
* QueuePipes:
* <ul>
* <li>SchedulingOverhead: 11337 ms
diff --git a/src/test/java/teetime/util/StopWatchTest.java b/src/test/java/teetime/util/StopWatchTest.java
new file mode 100644
index 00000000..8923df35
--- /dev/null
+++ b/src/test/java/teetime/util/StopWatchTest.java
@@ -0,0 +1,37 @@
+package teetime.util;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+public class StopWatchTest {
+
+ private static final int NUM_ITERATIONS = 1000000;
+
+ @Test
+ public void testNanotime() throws Exception {
+ StopWatch iterationStopWatch = new StopWatch();
+
+ List<Long> durationsInNs = new ArrayList<Long>(NUM_ITERATIONS);
+ for (int i = 0; i < NUM_ITERATIONS; i++) {
+ iterationStopWatch.start();
+ fib(BigInteger.valueOf(10l));
+ iterationStopWatch.end();
+ durationsInNs.add(iterationStopWatch.getDurationInNs());
+ }
+
+ Map<Double, Long> quintiles = StatisticsUtil.calculateQuintiles(durationsInNs);
+ StatisticsUtil.printQuintiles(quintiles);
+ }
+
+ public static BigInteger fib(final BigInteger n) {
+ if (n.compareTo(BigInteger.ONE) == -1 || n.compareTo(BigInteger.ONE) == 0) {
+ return n;
+ } else {
+ return fib(n.subtract(BigInteger.ONE)).add(fib(n.subtract(BigInteger.ONE).subtract(BigInteger.ONE)));
+ }
+ }
+}
--
GitLab