on master help sign in
Added benchmark for builder.
39b0a4bJohan Tibell
Data/Text/Builder.hs+5−5
@@ -229,9 +229,9 @@ unsafeCopy src sidx dest didx count =
229 assert (sidx + count <= A.length src) .
229 assert (sidx + count <= A.length src) .
230 assert (didx + count <= A.length dest) $
230 assert (didx + count <= A.length dest) $
231 copy_loop sidx didx 0
231 copy_loop sidx didx 0
232− where
232+ where
233− copy_loop !i !j !c
233+ copy_loop !i !j !c
234− | c >= count = return ()
234+ | c >= count = return ()
235− | otherwise = do A.unsafeWrite dest j (A.unsafeIndex src i)
235+ | otherwise = do A.unsafeWrite dest j (A.unsafeIndex src i)
236− copy_loop (i+1) (j+1) (c+1)
236+ copy_loop (i+1) (j+1) (c+1)
237{-# INLINE unsafeCopy #-}
237{-# INLINE unsafeCopy #-}
tests/Benchmarks.hs+22−1
@@ -1,4 +1,4 @@
1−{-# LANGUAGE GADTs, MagicHash #-}
1+{-# LANGUAGE BangPatterns, GADTs, MagicHash #-}
2
2
3import qualified Data.ByteString.Char8 as BS
3import qualified Data.ByteString.Char8 as BS
4import qualified Data.ByteString.Lazy.Char8 as BL
4import qualified Data.ByteString.Lazy.Char8 as BL
@@ -7,8 +7,10 @@ import Control.Monad.Trans (liftIO)
7import Control.Exception (evaluate)
7import Control.Exception (evaluate)
8import Criterion.Main
8import Criterion.Main
9import Data.Char
9import Data.Char
10+import Data.Monoid (mappend, mempty)
10import qualified Codec.Binary.UTF8.Generic as UTF8
11import qualified Codec.Binary.UTF8.Generic as UTF8
11import qualified Data.Text as TS
12import qualified Data.Text as TS
13+import qualified Data.Text.Builder as TB
12import qualified Data.Text.IO as TS
14import qualified Data.Text.IO as TS
13import qualified Data.Text.Lazy as TL
15import qualified Data.Text.Lazy as TL
14import qualified Data.Text.Lazy.IO as TL
16import qualified Data.Text.Lazy.IO as TL
@@ -388,6 +390,10 @@ main = do
388 , bench "bl" $ nf (L.length . BL.zipWith min blb) bla
390 , bench "bl" $ nf (L.length . BL.zipWith min blb) bla
389 , bench "l" $ nf (L.length . L.zipWith min lb) la
391 , bench "l" $ nf (L.length . L.zipWith min lb) la
390 ]
392 ]
393+ ],
394+ bgroup "builder" [
395+ bench "mappend char" $ nf (TL.length . TB.toLazyText . mappendNChar 'a') 10000,
396+ bench "mappend text" $ nf (TL.length . TB.toLazyText . mappendNText short) 10000
391 ]
397 ]
392 ]
398 ]
393 where
399 where
@@ -402,6 +408,7 @@ main = do
402 f (C# c#) = C# (chr# (ord# c# +# 1#))
408 f (C# c#) = C# (chr# (ord# c# +# 1#))
403 len l _ = l + (1::Int)
409 len l _ = l + (1::Int)
404 replicat n = concat . L.replicate n
410 replicat n = concat . L.replicate n
411+ short = TS.pack "short"
405
412
406chunksOf :: Int -> BS.ByteString -> [BS.ByteString]
413chunksOf :: Int -> BS.ByteString -> [BS.ByteString]
407chunksOf k = go
414chunksOf k = go
@@ -409,3 +416,17 @@ chunksOf k = go
409 go t = case BS.splitAt k t of
416 go t = case BS.splitAt k t of
410 (a,b) | BS.null a -> []
417 (a,b) | BS.null a -> []
411 | otherwise -> a : go b
418 | otherwise -> a : go b
419+
420+mappendNChar :: Char -> Int -> TB.Builder
421+mappendNChar c n = go 0 mempty
422+ where
423+ go i !acc
424+ | i < n = go (i+1) (acc `mappend` TB.singleton c)
425+ | otherwise = acc
426+
427+mappendNText :: TS.Text -> Int -> TB.Builder
428+mappendNText t n = go 0 mempty
429+ where
430+ go i !acc
431+ | i < n = go (i+1) (acc `mappend` TB.fromText t)
432+ | otherwise = acc