diff --git a/.settings/org.moreunit.prefs b/.settings/org.moreunit.prefs new file mode 100644 index 0000000000000000000000000000000000000000..b23adba051f1b921d58e03e5183f02b2627c5ce1 --- /dev/null +++ b/.settings/org.moreunit.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.moreunit.preferences.version=2 diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/AbstractStage.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/AbstractStage.java index 6e74f0ca4a4d090cccb81712e82c5bb05048e796..f54fa344dceafa4196316e3200ac99cad014b141 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/AbstractStage.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/AbstractStage.java @@ -22,6 +22,11 @@ public abstract class AbstractStage<I, O> implements StageWithPort<I, O> { private boolean reschedulable; + /** + * cached successor for default output port + */ + private StageWithPort<?, ?> next; + public AbstractStage() { this.id = UUID.randomUUID().toString(); // the id should only be represented by a UUID, not additionally by the class name this.logger = LogFactory.getLog(this.getClass().getName() + "(" + this.id + ")"); @@ -81,7 +86,8 @@ public abstract class AbstractStage<I, O> implements StageWithPort<I, O> { protected final void send(final OutputPort<O> outputPort, final O element) { outputPort.send(element); - StageWithPort<?, ?> next = outputPort.getPipe().getTargetPort().getOwningStage(); + // StageWithPort<?, ?> next = outputPort.getPipe().getTargetPort().getOwningStage(); + StageWithPort<?, ?> next = outputPort.getCachedTargetStage(); do { next.executeWithPorts(); @@ -102,6 +108,7 @@ public abstract class AbstractStage<I, O> implements StageWithPort<I, O> { @Override public void onStart() { // empty default implementation + this.next = (this.outputPort.getPipe() != null) ? this.outputPort.getPipe().getTargetPort().getOwningStage() : null; } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/InputPort.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/InputPort.java index d55ad342259a9699e06cd1d84e7fd306f0927729..6a614b766246772ac595be4e1796afc8ddd9e160 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/InputPort.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/InputPort.java @@ -26,6 +26,11 @@ public class InputPort<T> { return this.pipe; } + /** + * Connects this input port with the given <code>pipe</code> bi-directionally + * + * @param pipe + */ public void setPipe(final IPipe<T> pipe) { this.pipe = pipe; pipe.setTargetPort(this); diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/OutputPort.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/OutputPort.java index b426506e35b586d6722b3e38b032b8eddf43ad2a..36ce913f749d1a1723189fd76a5c65d81d9c9ef1 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/OutputPort.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/OutputPort.java @@ -5,6 +5,14 @@ import teetime.variant.methodcallWithPorts.framework.core.pipe.IPipe; public class OutputPort<T> { private IPipe<T> pipe; + /** + * Performance cache: Avoids the following method chain + * + * <pre> + * this.getPipe().getTargetPort().getOwningStage() + * </pre> + */ + private StageWithPort<?, ?> cachedTargetStage; public void send(final T element) { this.pipe.add(element); @@ -17,4 +25,13 @@ public class OutputPort<T> { public void setPipe(final IPipe<T> pipe) { this.pipe = pipe; } + + public StageWithPort<?, ?> getCachedTargetStage() { + return this.cachedTargetStage; + } + + public void setCachedTargetStage(final StageWithPort<?, ?> cachedTargetStage) { + this.cachedTargetStage = cachedTargetStage; + } + } diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/Pipeline.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/Pipeline.java index 35ec227550545ec5713be7d01dae33db6f4ff9a4..04ec724025bb280854c249b3914eb873598f4e49 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/Pipeline.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/Pipeline.java @@ -22,6 +22,8 @@ public class Pipeline<I, O> implements StageWithPort<I, O> { private final List<StageWithPort<?, ?>> intermediateStages = new LinkedList<StageWithPort<?, ?>>(); private StageWithPort<?, O> lastStage; + // BETTER remove the stage array and use the output ports instead for passing a signal to all stages in the same thread; what about multiple same signals due to + // multiple input ports? private StageWithPort<?, ?>[] stages; private StageWithPort<?, ?> parentStage; // private int startIndex; diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowableArrayPipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowableArrayPipe.java index 109824ffda5e28b4c4c287b29b1e1aa41c7495a4..ec4fa42520927ad92c3217c3f6a137e3f61ae006 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowableArrayPipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowableArrayPipe.java @@ -22,6 +22,7 @@ public class OrderedGrowableArrayPipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new OrderedGrowableArrayPipe<T>(); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowablePipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowablePipe.java index 4c36c839d551d521447797d0b679afc4c551c813..d7eb9a01800dad2f740f9193e9284acb9d916d9d 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowablePipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/OrderedGrowablePipe.java @@ -21,6 +21,7 @@ public class OrderedGrowablePipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new OrderedGrowablePipe<T>(); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/Pipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/Pipe.java index 79321208b4cdfea93782d44f280276595904dba9..b89f27ad4d94ef7e868b7fdfe44acf1e09f3d69a 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/Pipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/Pipe.java @@ -12,6 +12,7 @@ public class Pipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new Pipe<T>(); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } /* diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SingleElementPipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SingleElementPipe.java index 9440263d549b3b1262cf71c58a4f311a4c7ac13a..c9edc53621e5fae9dc91636e20c312694f39b4ba 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SingleElementPipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SingleElementPipe.java @@ -12,6 +12,7 @@ public class SingleElementPipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new SingleElementPipe<T>(); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SpScPipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SpScPipe.java index ece1f1d074beb50afa9c07048043b854ffc3379e..f55d3257200451fc04f6954a8977cf9d1ff94393 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SpScPipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/SpScPipe.java @@ -16,6 +16,7 @@ public class SpScPipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new SpScPipe<T>(initialCapacity); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/UnorderedGrowablePipe.java b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/UnorderedGrowablePipe.java index 48c2afa17062e810a323c01172fa7d41d344e8a1..729b651e841b1bf5354f2ec8a0fc7212250e0087 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/UnorderedGrowablePipe.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/framework/core/pipe/UnorderedGrowablePipe.java @@ -46,6 +46,7 @@ public class UnorderedGrowablePipe<T> extends AbstractPipe<T> { IPipe<T> pipe = new UnorderedGrowablePipe<T>(); sourcePort.setPipe(pipe); targetPort.setPipe(pipe); + sourcePort.setCachedTargetStage(targetPort.getOwningStage()); } @Override diff --git a/src/main/java/teetime/variant/methodcallWithPorts/stage/CollectorSink.java b/src/main/java/teetime/variant/methodcallWithPorts/stage/CollectorSink.java index f72b987ba40ccd347b79cdc1b6cdc2e74181e5e1..f3492e265eb32f4e6560c23f822063703d70a6ce 100644 --- a/src/main/java/teetime/variant/methodcallWithPorts/stage/CollectorSink.java +++ b/src/main/java/teetime/variant/methodcallWithPorts/stage/CollectorSink.java @@ -27,7 +27,7 @@ import teetime.variant.methodcallWithPorts.framework.core.ConsumerStage; */ public class CollectorSink<T> extends ConsumerStage<T, Object> { - private static final int THRESHOLD = 100; // TODO make configurable or use an sysout stage instead + private static final int THRESHOLD = 10000; // TODO make configurable or use an sysout stage instead private final List<T> elements; diff --git a/src/test/java/teetime/variant/methodcallWithPorts/examples/experiment15/MethodCallThroughputAnalysis15.java b/src/test/java/teetime/variant/methodcallWithPorts/examples/experiment15/MethodCallThroughputAnalysis15.java index 0ef9b18b8e687e12b2f693c3afbbe11780baed34..134d80aeb98e967a1d917e154272708aa508da25 100644 --- a/src/test/java/teetime/variant/methodcallWithPorts/examples/experiment15/MethodCallThroughputAnalysis15.java +++ b/src/test/java/teetime/variant/methodcallWithPorts/examples/experiment15/MethodCallThroughputAnalysis15.java @@ -22,8 +22,9 @@ import teetime.variant.explicitScheduling.examples.throughput.TimestampObject; import teetime.variant.explicitScheduling.framework.core.Analysis; import teetime.variant.methodcallWithPorts.framework.core.Pipeline; import teetime.variant.methodcallWithPorts.framework.core.RunnableStage; +import teetime.variant.methodcallWithPorts.framework.core.pipe.OrderedGrowableArrayPipe; +import teetime.variant.methodcallWithPorts.framework.core.pipe.SingleElementPipe; import teetime.variant.methodcallWithPorts.framework.core.pipe.SpScPipe; -import teetime.variant.methodcallWithPorts.framework.core.pipe.UnorderedGrowablePipe; import teetime.variant.methodcallWithPorts.stage.Clock; import teetime.variant.methodcallWithPorts.stage.CollectorSink; import teetime.variant.methodcallWithPorts.stage.Delay; @@ -99,15 +100,15 @@ public class MethodCallThroughputAnalysis15 extends Analysis { SpScPipe.connect(clock.getOutputPort(), delay.getTimestampTriggerInputPort(), SPSC_INITIAL_CAPACITY); - UnorderedGrowablePipe.connect(objectProducer.getOutputPort(), startTimestampFilter.getInputPort()); - UnorderedGrowablePipe.connect(startTimestampFilter.getOutputPort(), noopFilters[0].getInputPort()); + SingleElementPipe.connect(objectProducer.getOutputPort(), startTimestampFilter.getInputPort()); + SingleElementPipe.connect(startTimestampFilter.getOutputPort(), noopFilters[0].getInputPort()); for (int i = 0; i < noopFilters.length - 1; i++) { - UnorderedGrowablePipe.connect(noopFilters[i].getOutputPort(), noopFilters[i + 1].getInputPort()); + SingleElementPipe.connect(noopFilters[i].getOutputPort(), noopFilters[i + 1].getInputPort()); } - UnorderedGrowablePipe.connect(noopFilters[noopFilters.length - 1].getOutputPort(), stopTimestampFilter.getInputPort()); - UnorderedGrowablePipe.connect(stopTimestampFilter.getOutputPort(), delay.getInputPort()); + SingleElementPipe.connect(noopFilters[noopFilters.length - 1].getOutputPort(), stopTimestampFilter.getInputPort()); + OrderedGrowableArrayPipe.connect(stopTimestampFilter.getOutputPort(), delay.getInputPort()); - UnorderedGrowablePipe.connect(delay.getOutputPort(), collectorSink.getInputPort()); + SingleElementPipe.connect(delay.getOutputPort(), collectorSink.getInputPort()); return new RunnableStage(pipeline); }