diff --git a/src/Data/Unamb.hs b/src/Data/Unamb.hs
--- a/src/Data/Unamb.hs
+++ b/src/Data/Unamb.hs
@@ -117,10 +117,20 @@
 -- | Commutative operation with annihilator, in parallel.  For instance,
 -- '(*)'/0, '(&&)'/'False', '(||)'/'True', 'min'/'minBound', 'max'/'maxBound'.
 parAnnihilator :: Eq a => (a -> a -> a) -> a -> (a -> a -> a)
-parAnnihilator op ann = parCommute op'
- where
-   op' u v | u == ann  = u
-           | otherwise = op u v
+
+-- parAnnihilator op ann = parCommute op'
+--  where
+--    op' u v | u == ann  = u
+--            | otherwise = op u v
+
+-- The parCommute version can waste work while trying the two orderings.
+-- In the following version, one branch tries just one annihilator test.
+
+parAnnihilator op ann x y =
+  assuming (x == ann) ann `unamb`
+  (if y == ann then ann else x `op` y)
+
+
 
 -- | Parallel min with minBound short-circuit
 pmin :: (Ord a, Bounded a) => a -> a -> a
diff --git a/unamb.cabal b/unamb.cabal
--- a/unamb.cabal
+++ b/unamb.cabal
@@ -1,5 +1,5 @@
 Name:                unamb
-Version:             0.1.4
+Version:             0.1.5
 Cabal-Version:       >= 1.2
 Synopsis:            Unambiguous choice
 Category:            Concurrency, Data, Other
