From 822c6d4908c5657368badcd0de3c2738a3db1de1 Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Sun, 15 Jun 2014 01:00:18 +0200
Subject: [PATCH] added more performance tests

---
 ...odCallThoughputTimestampAnalysis5Test.java |  77 ++
 ...odCallThoughputTimestampAnalysis6Test.java |  77 ++
 ...odCallThoughputTimestampAnalysis7Test.java |  78 ++
 .../throughput/methodcall/AbstractStage.java  |  13 +
 .../MethodCallThroughputAnalysis3.java        |   1 +
 .../MethodCallThroughputAnalysis4.java        |   1 +
 .../MethodCallThroughputAnalysis5.java        | 140 +++
 .../MethodCallThroughputAnalysis6.java        | 933 ++++++++++++++++++
 .../MethodCallThroughputAnalysis7.java        | 131 +++
 .../throughput/methodcall/Pipeline.java       |  10 +
 .../examples/throughput/methodcall/Stage.java |   4 +
 11 files changed, 1465 insertions(+)
 create mode 100644 src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis5Test.java
 create mode 100644 src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis6Test.java
 create mode 100644 src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
 create mode 100644 src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis5.java
 create mode 100644 src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis6.java
 create mode 100644 src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java

diff --git a/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis5Test.java b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis5Test.java
new file mode 100644
index 00000000..5288049d
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis5Test.java
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import teetime.examples.throughput.methodcall.MethodCallThroughputAnalysis5;
+import teetime.util.StatisticsUtil;
+import teetime.util.StopWatch;
+
+import kieker.common.logging.LogFactory;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThoughputTimestampAnalysis5Test {
+
+	private static final int NUM_OBJECTS_TO_CREATE = 100000;
+	private static final int NUM_NOOP_FILTERS = 800;
+
+	@Before
+	public void before() {
+		System.setProperty(LogFactory.CUSTOM_LOGGER_JVM, "NONE");
+	}
+
+	// 500 times faster than our new framework
+	// TODO check why
+
+	@Test
+	public void testWithManyObjects() {
+		System.out.println("Testing teetime (mc) with NUM_OBJECTS_TO_CREATE=" + NUM_OBJECTS_TO_CREATE + ", NUM_NOOP_FILTERS="
+				+ NUM_NOOP_FILTERS + "...");
+		final StopWatch stopWatch = new StopWatch();
+		final List<TimestampObject> timestampObjects = new ArrayList<TimestampObject>(NUM_OBJECTS_TO_CREATE);
+
+		final MethodCallThroughputAnalysis5 analysis = new MethodCallThroughputAnalysis5();
+		analysis.setNumNoopFilters(NUM_NOOP_FILTERS);
+		analysis.setTimestampObjects(timestampObjects);
+		analysis.setInput(NUM_OBJECTS_TO_CREATE, new Callable<TimestampObject>() {
+			@Override
+			public TimestampObject call() throws Exception {
+				return new TimestampObject();
+			}
+		});
+		analysis.init();
+
+		stopWatch.start();
+		try {
+			analysis.start();
+		} finally {
+			stopWatch.end();
+		}
+
+		StatisticsUtil.printStatistics(stopWatch.getDurationInNs(), timestampObjects);
+	}
+
+}
diff --git a/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis6Test.java b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis6Test.java
new file mode 100644
index 00000000..4a7923f3
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis6Test.java
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import teetime.examples.throughput.methodcall.MethodCallThroughputAnalysis6;
+import teetime.util.StatisticsUtil;
+import teetime.util.StopWatch;
+
+import kieker.common.logging.LogFactory;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThoughputTimestampAnalysis6Test {
+
+	private static final int NUM_OBJECTS_TO_CREATE = 100000;
+	private static final int NUM_NOOP_FILTERS = 800;
+
+	@Before
+	public void before() {
+		System.setProperty(LogFactory.CUSTOM_LOGGER_JVM, "NONE");
+	}
+
+	// 500 times faster than our new framework
+	// TODO check why
+
+	@Test
+	public void testWithManyObjects() {
+		System.out.println("Testing teetime (mc) with NUM_OBJECTS_TO_CREATE=" + NUM_OBJECTS_TO_CREATE + ", NUM_NOOP_FILTERS="
+				+ NUM_NOOP_FILTERS + "...");
+		final StopWatch stopWatch = new StopWatch();
+		final List<TimestampObject> timestampObjects = new ArrayList<TimestampObject>(NUM_OBJECTS_TO_CREATE);
+
+		final MethodCallThroughputAnalysis6 analysis = new MethodCallThroughputAnalysis6();
+		analysis.setNumNoopFilters(NUM_NOOP_FILTERS);
+		analysis.setTimestampObjects(timestampObjects);
+		analysis.setInput(NUM_OBJECTS_TO_CREATE, new Callable<TimestampObject>() {
+			@Override
+			public TimestampObject call() throws Exception {
+				return new TimestampObject();
+			}
+		});
+		analysis.init();
+
+		stopWatch.start();
+		try {
+			analysis.start();
+		} finally {
+			stopWatch.end();
+		}
+
+		StatisticsUtil.printStatistics(stopWatch.getDurationInNs(), timestampObjects);
+	}
+
+}
diff --git a/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
new file mode 100644
index 00000000..7d816c11
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/MethodCallThoughputTimestampAnalysis7Test.java
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput;
+
+import java.util.ArrayList;
+import java.util.List;
+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;
+
+import kieker.common.logging.LogFactory;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThoughputTimestampAnalysis7Test {
+
+	private static final int NUM_OBJECTS_TO_CREATE = 100000;
+	private static final int NUM_NOOP_FILTERS = 800;
+
+	@Before
+	public void before() {
+		System.setProperty(LogFactory.CUSTOM_LOGGER_JVM, "NONE");
+	}
+
+	// 500 times faster than our new framework
+	// TODO check why
+
+	@Test
+	public void testWithManyObjects() {
+		System.out.println("Testing teetime (mc) with NUM_OBJECTS_TO_CREATE=" + NUM_OBJECTS_TO_CREATE + ", NUM_NOOP_FILTERS="
+				+ NUM_NOOP_FILTERS + "...");
+		final StopWatch stopWatch = new StopWatch();
+		final List<TimestampObject> timestampObjects = new ArrayList<TimestampObject>(NUM_OBJECTS_TO_CREATE);
+
+		final MethodCallThroughputAnalysis7 analysis = new MethodCallThroughputAnalysis7();
+		analysis.setNumNoopFilters(NUM_NOOP_FILTERS);
+		analysis.setTimestampObjects(timestampObjects);
+		analysis.setInput(NUM_OBJECTS_TO_CREATE, new Callable<TimestampObject>() {
+			@Override
+			public TimestampObject call() throws Exception {
+				return new TimestampObject();
+			}
+		});
+		analysis.init();
+
+		stopWatch.start();
+		try {
+			analysis.start();
+		} finally {
+			stopWatch.end();
+		}
+
+		StatisticsUtil.printStatistics(stopWatch.getDurationInNs(), timestampObjects);
+	}
+
+}
diff --git a/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java b/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java
index 83a53368..18f43603 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/AbstractStage.java
@@ -18,6 +18,8 @@ abstract class AbstractStage<I, O> implements Stage<I, O> {
 
 	private int index;
 
+	private Stage successor;
+
 	// @Override
 	// public InputPort<I> getInputPort() {
 	// return this.inputPort;
@@ -100,8 +102,19 @@ abstract class AbstractStage<I, O> implements Stage<I, O> {
 		return this.listener;
 	}
 
+	@Override
 	public void setListener(final OnDisableListener listener) {
 		this.listener = listener;
 	}
 
+	@Override
+	public Stage next() {
+		return this.successor;
+	}
+
+	@Override
+	public void setSuccessor(final Stage<?, ?> successor) {
+		this.successor = successor;
+	}
+
 }
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
index 4f98f4c7..c627098a 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis3.java
@@ -88,6 +88,7 @@ public class MethodCallThroughputAnalysis3 extends Analysis {
 					stage = stages[i];
 					element = stage.execute(element);
 				}
+
 				return true;
 			}
 
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis4.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis4.java
index bb17235f..eaf0c945 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis4.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis4.java
@@ -82,6 +82,7 @@ public class MethodCallThroughputAnalysis4 extends Analysis {
 				for (final NoopFilter<TimestampObject> noopFilter : noopFilters) {
 					object = noopFilter.execute(object);
 				}
+
 				object = stopTimestampFilter.execute(object);
 				collectorSink.execute(object);
 				return true;
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis5.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis5.java
new file mode 100644
index 00000000..394e28a6
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis5.java
@@ -0,0 +1,140 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput.methodcall;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import teetime.examples.throughput.TimestampObject;
+import teetime.framework.core.Analysis;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThroughputAnalysis5 extends Analysis {
+
+	public abstract class WrappingPipeline {
+
+		public abstract boolean execute();
+
+	}
+
+	private long numInputObjects;
+	private Callable<TimestampObject> inputObjectCreator;
+	private int numNoopFilters;
+	private List<TimestampObject> timestampObjects;
+	private Runnable runnable;
+
+	@Override
+	public void init() {
+		super.init();
+		this.runnable = this.buildPipeline();
+	}
+
+	/**
+	 * @param numNoopFilters
+	 * @since 1.10
+	 */
+	private Runnable buildPipeline() {
+		@SuppressWarnings("unchecked")
+		final NoopFilter<TimestampObject>[] noopFilters = new NoopFilter[this.numNoopFilters];
+		// create stages
+		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>();
+		}
+		final StopTimestampFilter stopTimestampFilter = new StopTimestampFilter();
+		final CollectorSink<TimestampObject> collectorSink = new CollectorSink<TimestampObject>(this.timestampObjects);
+
+		final List<Stage> stageList = new ArrayList<Stage>();
+		stageList.add(objectProducer);
+		stageList.add(startTimestampFilter);
+		stageList.addAll(Arrays.asList(noopFilters));
+		stageList.add(stopTimestampFilter);
+		stageList.add(collectorSink);
+
+		// using an array decreases the performance from 60ms to 440ms (by 7x)
+		final Stage[] stages = stageList.toArray(new Stage[0]);
+		for (int i = 0; i < stages.length - 1; i++) {
+			stages[i].setSuccessor(stages[i + 1]);
+		}
+		final Stage startStage = stages[0];
+
+		final WrappingPipeline pipeline = new WrappingPipeline() {
+			@Override
+			public boolean execute() {
+				Object element = null;
+				Stage stage = startStage;
+
+				element = stage.execute(element);
+				if (element == null) {
+					return false;
+				}
+				stage = stage.next();
+
+				do {
+					element = stage.execute(element);
+					stage = stage.next();
+				} while (stage != null);
+				return true;
+			}
+
+		};
+
+		final Runnable runnable = new Runnable() {
+			@Override
+			public void run() {
+				boolean success;
+				do {
+					success = pipeline.execute();
+				} while (success);
+			}
+		};
+		return runnable;
+	}
+
+	@Override
+	public void start() {
+		super.start();
+		this.runnable.run();
+	}
+
+	public void setInput(final int numInputObjects, final Callable<TimestampObject> inputObjectCreator) {
+		this.numInputObjects = numInputObjects;
+		this.inputObjectCreator = inputObjectCreator;
+	}
+
+	public int getNumNoopFilters() {
+		return this.numNoopFilters;
+	}
+
+	public void setNumNoopFilters(final int numNoopFilters) {
+		this.numNoopFilters = numNoopFilters;
+	}
+
+	public List<TimestampObject> getTimestampObjects() {
+		return this.timestampObjects;
+	}
+
+	public void setTimestampObjects(final List<TimestampObject> timestampObjects) {
+		this.timestampObjects = timestampObjects;
+	}
+}
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis6.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis6.java
new file mode 100644
index 00000000..2b74c99a
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis6.java
@@ -0,0 +1,933 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput.methodcall;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import teetime.examples.throughput.TimestampObject;
+import teetime.framework.core.Analysis;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThroughputAnalysis6 extends Analysis {
+
+	public abstract class WrappingPipeline {
+
+		public abstract boolean execute();
+
+	}
+
+	private long numInputObjects;
+	private Callable<TimestampObject> inputObjectCreator;
+	private int numNoopFilters;
+	private List<TimestampObject> timestampObjects;
+	private Runnable runnable;
+
+	@Override
+	public void init() {
+		super.init();
+		this.runnable = this.buildPipeline();
+	}
+
+	/**
+	 * @param numNoopFilters
+	 * @since 1.10
+	 */
+	private Runnable buildPipeline() {
+		@SuppressWarnings("unchecked")
+		final NoopFilter<TimestampObject>[] noopFilters = new NoopFilter[this.numNoopFilters];
+		// create stages
+		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>();
+		}
+		final StopTimestampFilter stopTimestampFilter = new StopTimestampFilter();
+		final CollectorSink<TimestampObject> collectorSink = new CollectorSink<TimestampObject>(this.timestampObjects);
+
+		List<Stage> stages = new ArrayList<Stage>();
+		stages.add(objectProducer);
+		stages.add(startTimestampFilter);
+		stages.addAll(Arrays.asList(noopFilters));
+		stages.add(stopTimestampFilter);
+		stages.add(collectorSink);
+
+		final WrappingPipeline pipeline = new WrappingPipeline() {
+			@Override
+			public boolean execute() {
+				TimestampObject object = objectProducer.execute(null);
+				if (object == null) {
+					return false;
+				}
+				object = startTimestampFilter.execute(object);
+				// for (final NoopFilter<TimestampObject> noopFilter : noopFilters) {
+				// object = noopFilter.execute(object);
+				// }
+
+				int i = 0;
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+				object = noopFilters[i++].execute(object);
+
+				object = stopTimestampFilter.execute(object);
+				collectorSink.execute(object);
+				return true;
+			}
+
+		};
+
+		final Runnable runnable = new Runnable() {
+			@Override
+			public void run() {
+				boolean success;
+				do {
+					success = pipeline.execute();
+				} while (success);
+			}
+		};
+		return runnable;
+	}
+
+	@Override
+	public void start() {
+		super.start();
+		this.runnable.run();
+	}
+
+	public void setInput(final int numInputObjects, final Callable<TimestampObject> inputObjectCreator) {
+		this.numInputObjects = numInputObjects;
+		this.inputObjectCreator = inputObjectCreator;
+	}
+
+	public int getNumNoopFilters() {
+		return this.numNoopFilters;
+	}
+
+	public void setNumNoopFilters(final int numNoopFilters) {
+		this.numNoopFilters = numNoopFilters;
+	}
+
+	public List<TimestampObject> getTimestampObjects() {
+		return this.timestampObjects;
+	}
+
+	public void setTimestampObjects(final List<TimestampObject> timestampObjects) {
+		this.timestampObjects = timestampObjects;
+	}
+}
diff --git a/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java
new file mode 100644
index 00000000..965a101b
--- /dev/null
+++ b/src/test/java/teetime/examples/throughput/methodcall/MethodCallThroughputAnalysis7.java
@@ -0,0 +1,131 @@
+/***************************************************************************
+ * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ***************************************************************************/
+package teetime.examples.throughput.methodcall;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import teetime.examples.throughput.TimestampObject;
+import teetime.framework.core.Analysis;
+
+/**
+ * @author Christian Wulf
+ * 
+ * @since 1.10
+ */
+public class MethodCallThroughputAnalysis7 extends Analysis {
+
+	public abstract class WrappingPipeline {
+
+		public abstract boolean execute();
+
+	}
+
+	private long numInputObjects;
+	private Callable<TimestampObject> inputObjectCreator;
+	private int numNoopFilters;
+	private List<TimestampObject> timestampObjects;
+	private Runnable runnable;
+
+	@Override
+	public void init() {
+		super.init();
+		this.runnable = this.buildPipeline();
+	}
+
+	/**
+	 * @param numNoopFilters
+	 * @since 1.10
+	 */
+	private Runnable buildPipeline() {
+		@SuppressWarnings("unchecked")
+		final NoopFilter<TimestampObject>[] noopFilters = new NoopFilter[this.numNoopFilters];
+		// create stages
+		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>();
+		}
+		final StopTimestampFilter stopTimestampFilter = new StopTimestampFilter();
+		final CollectorSink<TimestampObject> collectorSink = new CollectorSink<TimestampObject>(this.timestampObjects);
+
+		final List<Stage> stageList = new ArrayList<Stage>();
+		stageList.add(objectProducer);
+		stageList.add(startTimestampFilter);
+		stageList.addAll(Arrays.asList(noopFilters));
+		stageList.add(stopTimestampFilter);
+		stageList.add(collectorSink);
+
+		// using an array decreases the performance from 60ms to 200ms (by 3x)
+		final Stage[] stages = stageList.toArray(new Stage[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) {
+					element = stage.execute(element);
+					if (element == null) {
+						return false;
+					}
+				}
+				return true;
+			}
+
+		};
+
+		final Runnable runnable = new Runnable() {
+			@Override
+			public void run() {
+				boolean success;
+				do {
+					success = pipeline.execute();
+				} while (success);
+			}
+		};
+		return runnable;
+	}
+
+	@Override
+	public void start() {
+		super.start();
+		this.runnable.run();
+	}
+
+	public void setInput(final int numInputObjects, final Callable<TimestampObject> inputObjectCreator) {
+		this.numInputObjects = numInputObjects;
+		this.inputObjectCreator = inputObjectCreator;
+	}
+
+	public int getNumNoopFilters() {
+		return this.numNoopFilters;
+	}
+
+	public void setNumNoopFilters(final int numNoopFilters) {
+		this.numNoopFilters = numNoopFilters;
+	}
+
+	public List<TimestampObject> getTimestampObjects() {
+		return this.timestampObjects;
+	}
+
+	public void setTimestampObjects(final List<TimestampObject> timestampObjects) {
+		this.timestampObjects = timestampObjects;
+	}
+}
diff --git a/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java b/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java
index 975f9e00..f0789f7b 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/Pipeline.java
@@ -146,6 +146,16 @@ public class Pipeline<I, O> implements Stage<I, O>, OnDisableListener {
 		throw new IllegalStateException();
 	}
 
+	@Override
+	public Stage next() {
+		throw new IllegalStateException();
+	}
+
+	@Override
+	public void setSuccessor(final Stage<?, ?> successor) {
+		throw new IllegalStateException();
+	}
+
 	// @Override
 	// public OutputPort getOutputPort() {
 	// return this.lastStage.getOutputPort();
diff --git a/src/test/java/teetime/examples/throughput/methodcall/Stage.java b/src/test/java/teetime/examples/throughput/methodcall/Stage.java
index d9e39724..d9c0670e 100644
--- a/src/test/java/teetime/examples/throughput/methodcall/Stage.java
+++ b/src/test/java/teetime/examples/throughput/methodcall/Stage.java
@@ -23,4 +23,8 @@ public interface Stage<I, O> {
 	void setParentStage(Stage parentStage, int index);
 
 	void setListener(OnDisableListener listener);
+
+	Stage next();
+
+	void setSuccessor(Stage<?, ?> successor);
 }
-- 
GitLab