on master help sign in
Add Streaming benchmarks
6aa834aJasper Van der Jeugt
tests/benchmarks/src/Data/Text/Benchmarks.hs+2
@@ -19,6 +19,7 @@ import qualified Data.Text.Benchmarks.Pure as Pure
19import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
19import qualified Data.Text.Benchmarks.ReadNumbers as ReadNumbers
20import qualified Data.Text.Benchmarks.Replace as Replace
20import qualified Data.Text.Benchmarks.Replace as Replace
21import qualified Data.Text.Benchmarks.Search as Search
21import qualified Data.Text.Benchmarks.Search as Search
22+import qualified Data.Text.Benchmarks.Stream as Stream
22import qualified Data.Text.Benchmarks.WordFrequencies as WordFrequencies
23import qualified Data.Text.Benchmarks.WordFrequencies as WordFrequencies
23
24
24import qualified Data.Text.Benchmarks.Programs.BigTable as Programs.BigTable
25import qualified Data.Text.Benchmarks.Programs.BigTable as Programs.BigTable
@@ -52,6 +53,7 @@ benchmarks = do
52 , ReadNumbers.benchmark (tf "numbers.txt")
53 , ReadNumbers.benchmark (tf "numbers.txt")
53 , Replace.benchmark (tf "russian.txt") "принимая" "своем"
54 , Replace.benchmark (tf "russian.txt") "принимая" "своем"
54 , Search.benchmark (tf "russian.txt") "принимая"
55 , Search.benchmark (tf "russian.txt") "принимая"
56+ , Stream.benchmark (tf "russian.txt")
55 , WordFrequencies.benchmark (tf "russian.txt")
57 , WordFrequencies.benchmark (tf "russian.txt")
56 ]
58 ]
57
59
tests/benchmarks/src/Data/Text/Benchmarks/Stream.hsnew file+43
@@ -0,0 +1,43 @@
1+-- | This module contains a number of benchmarks for the different streaming
2+-- functions
3+--
4+-- Tested in this benchmark:
5+--
6+-- * Most streaming functions
7+--
8+{-# LANGUAGE BangPatterns #-}
9+{-# OPTIONS_GHC -fno-warn-orphans #-}
10+module Data.Text.Benchmarks.Stream
11+ ( benchmark
12+ ) where
13+
14+import Control.DeepSeq (NFData (..))
15+import Criterion (Benchmark, bgroup, bench, nf)
16+import Data.Text.Fusion.Internal (Step (..), Stream (..))
17+import qualified Data.ByteString as B
18+import qualified Data.ByteString.Lazy as BL
19+import qualified Data.Text.Encoding.Error as E
20+import qualified Data.Text.Encoding.Fusion as T
21+import qualified Data.Text.Lazy.Encoding.Fusion as TL
22+
23+instance NFData a => NFData (Stream a) where
24+ -- Currently, this implementation does not force evaluation of the size hint
25+ rnf (Stream next s0 _) = go s0
26+ where
27+ go !s = case next s of
28+ Done -> ()
29+ Skip s' -> go s'
30+ Yield x s' -> rnf x `seq` go s'
31+
32+benchmark :: FilePath -> IO Benchmark
33+benchmark fp = do
34+ -- Load data
35+ bs <- B.readFile fp
36+ lbs <- BL.readFile fp
37+
38+ return $ bgroup "Stream"
39+ [ bgroup "streamUtf8"
40+ [ bench "Text" $ nf (T.streamUtf8 E.lenientDecode) bs
41+ , bench "LazyText" $ nf (TL.streamUtf8 E.lenientDecode) lbs
42+ ]
43+ ]