[commit: packages/binary] master: Rewrite mappend to only depend on the Builders. (6ca5897)
git at git.haskell.org
git at git.haskell.org
Tue Apr 19 20:30:48 UTC 2016
Repository : ssh://git@git.haskell.org/binary
On branch : master
Link : http://git.haskell.org/packages/binary.git/commitdiff/6ca5897ce22b6bf9cf9b4a0e8ce72994928d413f
>---------------------------------------------------------------
commit 6ca5897ce22b6bf9cf9b4a0e8ce72994928d413f
Author: Lennart Kolmodin <kolmodin at gmail.com>
Date: Sat Apr 16 10:04:47 2016 +0200
Rewrite mappend to only depend on the Builders.
This gives a 5% speedup in the generics-bench benchmark.
>---------------------------------------------------------------
6ca5897ce22b6bf9cf9b4a0e8ce72994928d413f
src/Data/Binary/Generic.hs | 9 +++++----
src/Data/Binary/Put.hs | 5 ++++-
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/Data/Binary/Generic.hs b/src/Data/Binary/Generic.hs
index 9967f95..bcf8e46 100644
--- a/src/Data/Binary/Generic.hs
+++ b/src/Data/Binary/Generic.hs
@@ -28,26 +28,27 @@ import Data.Binary.Get
import Data.Binary.Put
import Data.Bits
import Data.Word
+import Data.Monoid ((<>))
import GHC.Generics
import Prelude -- Silence AMP warning.
-- Type without constructors
instance GBinaryPut V1 where
- gput _ = return ()
+ gput _ = pure ()
instance GBinaryGet V1 where
gget = return undefined
-- Constructor without arguments
instance GBinaryPut U1 where
- gput U1 = return ()
+ gput U1 = pure ()
instance GBinaryGet U1 where
gget = return U1
-- Product: constructor with parameters
instance (GBinaryPut a, GBinaryPut b) => GBinaryPut (a :*: b) where
- gput (x :*: y) = gput x >> gput y
+ gput (x :*: y) = gput x <> gput y
instance (GBinaryGet a, GBinaryGet b) => GBinaryGet (a :*: b) where
gget = (:*:) <$> gget <*> gget
@@ -130,7 +131,7 @@ instance GBinaryGet a => GSumGet (C1 c a) where
getSum _ _ = gget
instance GBinaryPut a => GSumPut (C1 c a) where
- putSum !code _ x = put code *> gput x
+ putSum !code _ x = put code <> gput x
------------------------------------------------------------------------
diff --git a/src/Data/Binary/Put.hs b/src/Data/Binary/Put.hs
index 07a86c0..23db39f 100644
--- a/src/Data/Binary/Put.hs
+++ b/src/Data/Binary/Put.hs
@@ -139,7 +139,10 @@ instance Monoid (PutM ()) where
mempty = pure ()
{-# INLINE mempty #-}
- mappend = (>>)
+ mappend m k = Put $
+ let PairS _ w = unPut m
+ PairS _ w' = unPut k
+ in PairS () (w `mappend` w')
{-# INLINE mappend #-}
tell :: Builder -> Put
More information about the ghc-commits
mailing list