Benchmark the new partition implementations.
authorSean <burton.seanr@gmail.com>
Wed, 30 Sep 2015 10:03:37 +0000 (11:03 +0100)
committerSean <burton.seanr@gmail.com>
Wed, 30 Sep 2015 10:03:37 +0000 (11:03 +0100)
bench/BenchAll.hs
bench/bench-bytestring.cabal

index 109ea9a..1f8f69c 100644 (file)
@@ -38,6 +38,8 @@ import qualified "bytestring" Data.ByteString.Lazy as OldL
 
 import           Foreign
 
+import System.Random
+
 ------------------------------------------------------------------------------
 -- Benchmark support
 ------------------------------------------------------------------------------
@@ -149,7 +151,30 @@ benchIntEncodingB n0 w
       | n <= 0    = return op
       | otherwise = PI.runB w n op >>= loop (n - 1)
 
+hashInt :: Int -> Int
+hashInt x = iterate step x !! 10
+  where
+    step a = e
+      where b = (a `xor` 61) `xor` (a `shiftR` 16)
+            c = b + (b `shiftL` 3)
+            d = c `xor` (c `shiftR` 4)
+            e = d * 0x27d4eb2d
+            f = e `xor` (e `shiftR` 15)
+
+hashWord8 :: Word8 -> Word8
+hashWord8 = fromIntegral . hashInt . fromIntegral
+
+w :: Int -> Word8
+w = fromIntegral
+
+partitionStrict p = nf (S.partition p) . randomStrict $ mkStdGen 98423098
+  where randomStrict = fst . S.unfoldrN 10000 (Just . random)
 
+partitionLazy p = nf (L.partition p) . randomLazy $ (0, mkStdGen 98423098)
+  where  step (k, g)
+           | k >= 10000 = Nothing
+           | otherwise  = let (x, g') = random g in Just (x, (k + 1, g'))
+         randomLazy = L.unfoldr step
 
 -- benchmarks
 -------------
@@ -302,4 +327,27 @@ main = do
       , benchFE "floatHexFixed"    $ fromIntegral >$< P.floatHexFixed
       , benchFE "doubleHexFixed"   $ fromIntegral >$< P.doubleHexFixed
       ]
+    , bgroup "partition"
+      [
+        bgroup "strict"
+        [
+          bench "mostlyTrueFast"  $ partitionStrict (< (w 225))
+        , bench "mostlyFalseFast" $ partitionStrict (< (w 10))
+        , bench "balancedFast"    $ partitionStrict (< (w 128))
+
+        , bench "mostlyTrueSlow"  $ partitionStrict (\x -> hashWord8 x < w 225)
+        , bench "mostlyFalseSlow" $ partitionStrict (\x -> hashWord8 x < w 10)
+        , bench "balancedSlow"    $ partitionStrict (\x -> hashWord8 x < w 128)
+        ]
+      , bgroup "lazy"
+        [
+          bench "mostlyTrueFast"  $ partitionLazy (< (w 225))
+        , bench "mostlyFalseFast" $ partitionLazy (< (w 10))
+        , bench "balancedFast"    $ partitionLazy (< (w 128))
+
+        , bench "mostlyTrueSlow"  $ partitionLazy (\x -> hashWord8 x < w 225)
+        , bench "mostlyFalseSlow" $ partitionLazy (\x -> hashWord8 x < w 10)
+        , bench "balancedSlow"    $ partitionLazy (\x -> hashWord8 x < w 128)
+        ]
+      ]
     ]
index 6421301..ae87a10 100644 (file)
@@ -42,6 +42,7 @@ executable bench-bytestring-builder
                    -- we require bytestring due to benchmarking against
                    -- blaze-textual, which uses blaze-builder
                    , bytestring    >= 0.9
+                   , random
 
   -- cabal complains about ../ dirs. However, this is better than symlinks,
   -- which probably don't work on windows.