@@ -1,4 +1,4 @@
1−{-# LANGUAGE GADTs, MagicHash #-}
1+{-# LANGUAGE BangPatterns, GADTs, MagicHash #-}
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
395+ bench "mappend char" $ nf (TL.length . TB.toLazyText . mappendNChar 'a') 10000,
396+ bench "mappend text" $ nf (TL.length . TB.toLazyText . mappendNText short) 10000
@@ -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"
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
420+mappendNChar :: Char -> Int -> TB.Builder
421+mappendNChar c n = go 0 mempty
424+ | i < n = go (i+1) (acc `mappend` TB.singleton c)
427+mappendNText :: TS.Text -> Int -> TB.Builder
428+mappendNText t n = go 0 mempty
431+ | i < n = go (i+1) (acc `mappend` TB.fromText t)