diff --git a/src/main/java/teetime/stage/MultipleInstanceOfFilter.java b/src/main/java/teetime/stage/MultipleInstanceOfFilter.java index f2d34990cb81da00e25986e50e6f50930678692a..23aea142b7ca1f37170242cd4ad7c1229b0f459f 100644 --- a/src/main/java/teetime/stage/MultipleInstanceOfFilter.java +++ b/src/main/java/teetime/stage/MultipleInstanceOfFilter.java @@ -13,6 +13,7 @@ import teetime.framework.OutputPort; public final class MultipleInstanceOfFilter<I> extends AbstractConsumerStage<I> { private final Map<Class<? extends I>, OutputPort<? super I>> outputPortsMap = new HashMap<Class<? extends I>, OutputPort<? super I>>(); + private Entry<Class<? extends I>, OutputPort<? super I>>[] cachedOutputPortsMap; @SuppressWarnings("unchecked") public <T extends I> OutputPort<T> getOutputPortForType(final Class<T> clazz) { @@ -22,13 +23,21 @@ public final class MultipleInstanceOfFilter<I> extends AbstractConsumerStage<I> return (OutputPort<T>) this.outputPortsMap.get(clazz); } + @Override + @SuppressWarnings("unchecked") + public void onStarting() throws Exception { + super.onStarting(); + + // We cache the map to avoid the creating of iterators during runtime + cachedOutputPortsMap = (Entry<Class<? extends I>, OutputPort<? super I>>[]) outputPortsMap.entrySet().toArray(new Entry<?, ?>[outputPortsMap.size()]); + } + @Override protected void execute(final I element) { - for (Entry<Class<? extends I>, OutputPort<? super I>> outputPortMapEntry : outputPortsMap.entrySet()) { + for (Entry<Class<? extends I>, OutputPort<? super I>> outputPortMapEntry : cachedOutputPortsMap) { if (outputPortMapEntry.getKey().isInstance(element)) { outputPortMapEntry.getValue().send(element); } } } - }