Optimise atomicModifyIORef' implementation (#8345)
authorDavid Feuer <David.Feuer@gmail.com>
Mon, 27 Oct 2014 09:21:20 +0000 (10:21 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Mon, 27 Oct 2014 09:24:21 +0000 (10:24 +0100)
This forces the new value before installing it in the IORef.

This optimisation was originally suggested by Patrick Palka
and "exhibits a speedup of 1.7x (vanilla RTS) / 1.4x (threaded RTS)"
according to #8345

Reviewed By: austin, simonmar

Differential Revision: https://phabricator.haskell.org/D315

libraries/base/Data/IORef.hs

index 0e5717c..2981805 100644 (file)
@@ -106,9 +106,9 @@ atomicModifyIORef = GHC.IORef.atomicModifyIORef
 -- /Since: 4.6.0.0/
 atomicModifyIORef' :: IORef a -> (a -> (a,b)) -> IO b
 atomicModifyIORef' ref f = do
-    b <- atomicModifyIORef ref
-            (\x -> let (a, b) = f x
-                    in (a, a `seq` b))
+    b <- atomicModifyIORef ref $ \a ->
+            case f a of
+                v@(a',_) -> a' `seq` v
     b `seq` return b
 
 -- | Variant of 'writeIORef' with the \"barrier to reordering\" property that