diff --git a/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java b/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java index 18f43603251edb14f64ee41f0b5c6d190140277f..acd437ab5afe783fddecfb611ee0d1bc697fcf4b 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java +++ b/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java @@ -20,6 +20,8 @@ abstract class AbstractStage<I, O> implements Stage<I, O> { private Stage successor; + private boolean reschedulable; + // @Override // public InputPort<I> getInputPort() { // return this.inputPort; @@ -48,18 +50,10 @@ abstract class AbstractStage<I, O> implements Stage<I, O> { // throw new IllegalStateException(); // } - // boolean inputIsEmpty = elements.isEmpty(); - this.execute4(elements); this.outputElements.commit(); - // boolean outputIsEmpty = this.outputElements.isEmpty(); - // - // if (inputIsEmpty && outputIsEmpty) { - // this.disable(); - // } - return this.outputElements; } @@ -69,6 +63,11 @@ abstract class AbstractStage<I, O> implements Stage<I, O> { protected final void send(final O element) { this.outputElements.addToTailUncommitted(element); + + this.outputElements.commit(); + do { + CommittableQueue execute = this.next().execute2(this.outputElements); + } while (this.next().isReschedulable()); } @Override @@ -117,4 +116,13 @@ abstract class AbstractStage<I, O> implements Stage<I, O> { this.successor = successor; } + @Override + public boolean isReschedulable() { + return this.reschedulable; + } + + public void setReschedulable(final boolean reschedulable) { + this.reschedulable = reschedulable; + } + } diff --git a/src/test/java/teetime/examples/throughput/methodcall/ConsumerStage.java b/src/test/java/teetime/examples/throughput/methodcall/ConsumerStage.java index 0948612d7c19387eff64641f87c49e218531421b..51ecdc300b50f0547dd2d9bd09580954c4072747 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/ConsumerStage.java +++ b/src/test/java/teetime/examples/throughput/methodcall/ConsumerStage.java @@ -12,7 +12,9 @@ public abstract class ConsumerStage<I, O> extends AbstractStage<I, O> { return this.outputElements; } - return super.execute2(elements); + CommittableQueue<O> output = super.execute2(elements); + this.setReschedulable(!elements.isEmpty()); // costs ~1200 ns on chw-work + return output; } } diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis2.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis2.java index c1c4f42047cdd9bc691698324ff73bb25ed1a238..330bda0b4eae85e18a37860b7a0c8f617c21e9f8 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis2.java +++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis2.java @@ -80,7 +80,7 @@ public class MethodCallThroughputAnalysis2 extends Analysis { do { outputQueue = pipeline.execute2(inputQueue); - } while (pipeline.getSchedulingInformation().isActive()); + } while (pipeline.getSchedulingInformation().isActive() && pipeline.isReschedulable()); } }; diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis8.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis8.java index 916727cf88daf1f002ca2ed8d9c9436dd69bda22..7c8fecc8518fd04f1ecd07cbe0b632a816852295 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis8.java +++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis8.java @@ -75,11 +75,13 @@ public class MethodCallThroughputAnalysis8 extends Analysis { final AbstractStage[] stages = stageList.toArray(new AbstractStage[0]); final WrappingPipeline pipeline = new WrappingPipeline() { + private int startIndex; + @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 (int i = 0; i < stages.length; i++) { + for (int i = this.startIndex; i < stages.length; i++) { Stage stage = stages[i]; element = stage.execute(element); if (element == null) { diff --git a/src/test/java/teetime/examples/throughput/methodcall/ObjectProducer.java b/src/test/java/teetime/examples/throughput/methodcall/ObjectProducer.java index 7c4199d271d26f097ffd080ff89673e967d6aa1a..db409576ca95fdf336195304c8eb4818e3bcfb8f 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/ObjectProducer.java +++ b/src/test/java/teetime/examples/throughput/methodcall/ObjectProducer.java @@ -40,6 +40,7 @@ public class ObjectProducer<T> extends ProducerStage<Void, T> { @Override public T execute(final Object element) { if (this.numInputObjects == 0) { + this.setReschedulable(false); return null; } @@ -89,6 +90,7 @@ public class ObjectProducer<T> extends ProducerStage<Void, T> { @Override protected void execute4(final CommittableQueue<Void> elements) { if (this.numInputObjects == 0) { + this.setReschedulable(false); return; } diff --git a/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java b/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java index f0789f7b7dd7bc58d6c03021d5c497ba9b8cf6c8..8be8637cae36318f037234577d2ba3f8ef0e2d53 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java +++ b/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java @@ -20,6 +20,8 @@ public class Pipeline<I, O> implements Stage<I, O>, OnDisableListener { private int startIndex; private OnDisableListener listener; + private boolean reschedulable; + void setFirstStage(final Stage<I, ?> stage) { this.firstStage = stage; } @@ -46,10 +48,14 @@ public class Pipeline<I, O> implements Stage<I, O>, OnDisableListener { // below is faster than above (probably because of the instantiation of a list iterator in each (!) execution) CommittableQueue queue = elements; - for (int i = this.startIndex; i < this.stages.length; i++) { - Stage<?, ?> stage = this.stages[i]; - queue = stage.execute2(queue); - } + + // for (int i = this.startIndex; i < this.stages.length; i++) { + // Stage<?, ?> stage = this.stages[i]; + // queue = stage.execute2(queue); + // } + + this.stages[0].execute2(elements); + this.setReschedulable(this.stages[0].isReschedulable()); return queue; } @@ -89,6 +95,11 @@ public class Pipeline<I, O> implements Stage<I, O>, OnDisableListener { stage.setParentStage(this, i); stage.setListener(this); } + + for (int i = 0; i < this.stages.length - 1; i++) { + Stage<?, ?> stage = this.stages[i]; + stage.setSuccessor(this.stages[i + 1]); + } } // @@ -156,6 +167,15 @@ public class Pipeline<I, O> implements Stage<I, O>, OnDisableListener { throw new IllegalStateException(); } + @Override + public boolean isReschedulable() { + return this.reschedulable; + } + + public void setReschedulable(final boolean reschedulable) { + this.reschedulable = reschedulable; + } + // @Override // public OutputPort getOutputPort() { // return this.lastStage.getOutputPort(); diff --git a/src/test/java/teetime/examples/throughput/methodcall/ProducerStage.java b/src/test/java/teetime/examples/throughput/methodcall/ProducerStage.java index be0f81e4215424c6409efae0db1ab7f52030aba5..262119dc8bfd9eecc35d7b99c0be1ad3bb5116b9 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/ProducerStage.java +++ b/src/test/java/teetime/examples/throughput/methodcall/ProducerStage.java @@ -4,6 +4,10 @@ import teetime.util.list.CommittableQueue; public abstract class ProducerStage<I, O> extends AbstractStage<I, O> { + public ProducerStage() { + this.setReschedulable(true); + } + @Override public CommittableQueue<O> execute2(final CommittableQueue<I> elements) { CommittableQueue<O> outputElements = super.execute2(elements); @@ -15,4 +19,5 @@ public abstract class ProducerStage<I, O> extends AbstractStage<I, O> { return outputElements; } + } diff --git a/src/test/java/teetime/examples/throughput/methodcall/Stage.java b/src/test/java/teetime/examples/throughput/methodcall/Stage.java index d9c0670ea165f9c0a95517f11fc74991907c5b4c..10eefc4593599d0d9b94b6cae1794a1da8928e42 100644 --- a/src/test/java/teetime/examples/throughput/methodcall/Stage.java +++ b/src/test/java/teetime/examples/throughput/methodcall/Stage.java @@ -27,4 +27,6 @@ public interface Stage<I, O> { Stage next(); void setSuccessor(Stage<?, ?> successor); + + boolean isReschedulable(); }