packages feed

vector-binary-instances 0.2.2.0 → 0.2.3.0

raw patch · 3 files changed

+48/−11 lines, 3 files

Files

Data/Vector/Binary.hs view
@@ -45,10 +45,12 @@ import Data.Binary  import qualified Data.Vector.Generic   as G+import qualified Data.Vector.Generic.Mutable as GM import qualified Data.Vector.Unboxed   as U import qualified Data.Vector.Storable  as S import qualified Data.Vector.Primitive as P import Data.Vector (Vector)+import System.IO.Unsafe  import Foreign.Storable (Storable) @@ -87,8 +89,14 @@     -> Get (v a) {-# INLINE genericGetVectorWith #-} genericGetVectorWith getN getA = do-    n  <- getN-    G.replicateM n getA+    n <- getN+    v <- return $ unsafePerformIO $ GM.unsafeNew n+    let go 0 = return ()+        go i = do x <- getA+                  () <- return $ unsafePerformIO $ GM.unsafeWrite v (i-1) x+                  go (i-1)+    () <- go n+    return $ unsafePerformIO $ G.unsafeFreeze v  -- | Generic put for anything in the G.Vector class which uses custom --   encoders.
benchmarks/Benchmarks.hs view
@@ -1,33 +1,62 @@ import Criterion.Main import Data.Binary+import Data.Binary.Get  import qualified Data.ByteString.Lazy     as BS import qualified Data.Vector.Unboxed as U import Data.Vector.Binary  -vec1,vec2,vec3 :: U.Vector Int+vec1,vec2,vec3,vec4,vec5 :: U.Vector Int vec1 = U.enumFromN 0 3 vec2 = U.enumFromN 0 30 vec3 = U.enumFromN 0 300+vec4 = U.enumFromN 0 30000+vec5 = U.enumFromN 0 300000 -bs1,bs2,bs3 :: BS.ByteString+bs1,bs2,bs3,bs4,bs5 :: BS.ByteString bs1 = encode vec1 bs2 = encode vec2 bs3 = encode vec3+bs4 = encode vec4+bs5 = encode vec5 +naiveGet :: (Binary a, U.Unbox a) => Get (U.Vector a)+naiveGet = do+    n <- get+    U.replicateM n get++naiveGet' :: (Binary a, U.Unbox a) => Get (U.Vector a)+naiveGet' = do+    n <- get+    U.replicateM n get+-- A feeble attempt at simulating what will happen if we end up with a situation+-- where we are unable to specialize to the element type+{-# NOINLINE naiveGet' #-}+ type V = BS.ByteString -> U.Vector Int +benchGetSize :: String -> BS.ByteString -> Benchmark+benchGetSize name bs = bgroup name+    [ bench "U.Vector Int"                 $ nf (decode :: V) bs+    , bench "naive U.Vector Int"           $ nf (runGet naiveGet :: V) bs+    , bench "noinline naive U.Vector Int"  $ nf (runGet naiveGet' :: V) bs+    ]+ main = defaultMain   [ bgroup "encode"-    [ bench "U.Vector Int 3"   $ nf encode vec1-    , bench "U.Vector Int 30"  $ nf encode vec2-    , bench "U.Vector Int 300" $ nf encode vec3+    [ bench "U.Vector Int 3"      $ nf encode vec1+    , bench "U.Vector Int 30"     $ nf encode vec2+    , bench "U.Vector Int 300"    $ nf encode vec3+    , bench "U.Vector Int 30000"  $ nf encode vec4+    , bench "U.Vector Int 300000" $ nf encode vec5     ]   , bgroup "decode"-    [ bench "U.Vector Int 3"   $ nf (decode :: V) bs1-    , bench "U.Vector Int 30"  $ nf (decode :: V) bs2-    , bench "U.Vector Int 300" $ nf (decode :: V) bs3+    [ benchGetSize "size=3" bs1+    , benchGetSize "size=30" bs2+    , benchGetSize "size=300" bs3+    , benchGetSize "size=30000" bs4+    , benchGetSize "size=300000" bs5     ]   ] 
vector-binary-instances.cabal view
@@ -1,5 +1,5 @@ Name:                vector-binary-instances-Version:             0.2.2.0+Version:             0.2.3.0 Synopsis:            Instances of Data.Binary and Data.Serialize for vector Description:    Instances for Binary for the types defined in the vector package,