diff --git a/src/samplefunctional.hh b/src/samplefunctional.hh
index 7504cb8070336dd3830de9dcf28e912a24050d88..a6a2d55383b4586d5bbb85cd44d8cf922edf95ff 100644
--- a/src/samplefunctional.hh
+++ b/src/samplefunctional.hh
@@ -78,7 +78,7 @@ template <int dim> class SampleFunctional {
       // points in direction -x. The projection will then be zero.
       SmallVector d;
       smoothGradient(x, d);
-      ret = negative_projection(d, x);
+      negative_projection(d, x, ret);
       dverb << "## Directional derivative (as per scalar product w/ "
                "semigradient): " << -(ret * ret)
             << " (coordinates of the restriction)" << std::endl;
@@ -111,12 +111,13 @@ template <int dim> class SampleFunctional {
     y += z;
   }
 
-  // No normalising is done!
-  SmallVector negative_projection(SmallVector const z,
-                                  SmallVector const x) const {
-    SmallVector y = z;
-    y.axpy(-(z * x) / x.two_norm2(), x);
-    return y;
+  // y = (id - P)(d) where P is the projection onto the line t*x
+  void negative_projection(SmallVector const &d, SmallVector const &x,
+                           SmallVector &y) const {
+    double const dx = d * x;
+    double const xx = x.two_norm2();
+    y = d;
+    y.axpy(-dx / xx, x);
   }
 };