Index: trunk/sources/HeuristicLab.Operators/3.3/InstrumentedOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/InstrumentedOperator.cs	(revision 10196)
+++ trunk/sources/HeuristicLab.Operators/3.3/InstrumentedOperator.cs	(revision 10231)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -32,15 +33,15 @@
     private const string AfterExecutionOperatorsParameterName = "AfterExecutionOperators";
 
-    private IFixedValueParameter<ItemList<SingleSuccessorOperator>> BeforeExecutionOperatorsParameter {
-      get { return (IFixedValueParameter<ItemList<SingleSuccessorOperator>>)Parameters[BeforeExecutionOperatorsParameterName]; }
+    private IFixedValueParameter<OperatorList> BeforeExecutionOperatorsParameter {
+      get { return (IFixedValueParameter<OperatorList>)Parameters[BeforeExecutionOperatorsParameterName]; }
     }
-    private IFixedValueParameter<ItemList<SingleSuccessorOperator>> AfterExecutionOperatorsParameter {
-      get { return (IFixedValueParameter<ItemList<SingleSuccessorOperator>>)Parameters[AfterExecutionOperatorsParameterName]; }
+    private IFixedValueParameter<OperatorList> AfterExecutionOperatorsParameter {
+      get { return (IFixedValueParameter<OperatorList>)Parameters[AfterExecutionOperatorsParameterName]; }
     }
 
-    public ItemList<SingleSuccessorOperator> BeforeExecutionOperators {
+    public OperatorList BeforeExecutionOperators {
       get { return BeforeExecutionOperatorsParameter.Value; }
     }
-    public ItemList<SingleSuccessorOperator> AfterExecutionOperators {
+    public OperatorList AfterExecutionOperators {
       get { return AfterExecutionOperatorsParameter.Value; }
     }
@@ -53,6 +54,6 @@
     protected InstrumentedOperator()
       : base() {
-      Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new ItemList<SingleSuccessorOperator>()));
-      Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+      Parameters.Add(new FixedValueParameter<OperatorList>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new OperatorList()));
+      Parameters.Add(new FixedValueParameter<OperatorList>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new OperatorList()));
       BeforeExecutionOperatorsParameter.Hidden = true;
       AfterExecutionOperatorsParameter.Hidden = true;
@@ -64,9 +65,9 @@
       #region Backwards compatible code, remove with 3.4
       if (!Parameters.ContainsKey(BeforeExecutionOperatorsParameterName)) {
-        Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+        Parameters.Add(new FixedValueParameter<OperatorList>(BeforeExecutionOperatorsParameterName, "Actions that are executed before the execution of the operator", new OperatorList()));
         BeforeExecutionOperatorsParameter.Hidden = true;
       }
       if (!Parameters.ContainsKey(AfterExecutionOperatorsParameterName)) {
-        Parameters.Add(new FixedValueParameter<ItemList<SingleSuccessorOperator>>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new ItemList<SingleSuccessorOperator>()));
+        Parameters.Add(new FixedValueParameter<OperatorList>(AfterExecutionOperatorsParameterName, "Actions that are executed after the execution of the operator", new OperatorList()));
         AfterExecutionOperatorsParameter.Hidden = true;
       }
@@ -75,9 +76,12 @@
 
     public sealed override IOperation Apply() {
-      var opCol = new OperationCollection();
+      //to speed up the execution call instrumented apply directly if no before operators exists
+      if (!BeforeExecutionOperators.Any())
+        return InstrumentedApply();
 
       //build before operations
+      var opCol = new OperationCollection();
       foreach (var beforeAction in BeforeExecutionOperators) {
-        IOperation beforeActionOperation = ExecutionContext.CreateOperation(beforeAction);
+        var beforeActionOperation = ExecutionContext.CreateOperation(beforeAction);
         opCol.Add(beforeActionOperation);
       }
@@ -88,9 +92,15 @@
 
     public virtual IOperation InstrumentedApply() {
+      if (!AfterExecutionOperators.Any()) {
+        if (Successor != null) return ExecutionContext.CreateOperation(Successor);
+        return null;
+      }
+
       var opCol = new OperationCollection();
       foreach (var afterAction in AfterExecutionOperators) {
-        IOperation afterActionOperation = ExecutionContext.CreateOperation(afterAction);
+        var afterActionOperation = ExecutionContext.CreateOperation(afterAction);
         opCol.Add(afterActionOperation);
       }
+
       if (Successor != null)
         opCol.Add(ExecutionContext.CreateOperation(Successor));
