say-0.1.0.0: bench/say-bench.hs
import Criterion.Main
import qualified System.IO as IO
import System.IO.Temp
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.Text.IO as TIO
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Say
main :: IO ()
main = withSystemTempFile "say-bench" $ \_ h -> do
defaultMain $ map (doSize h)
[ 10
, 100
, 1000
, 10000
, 100000
]
doSize :: IO.Handle -> Int -> Benchmark
doSize h size = bgroup (show size)
[ doString h "ascii" $ replicate size 'A'
, doString h "non-ascii" $ replicate size 'א'
]
doString :: IO.Handle -> String -> String -> Benchmark
doString h name' str = bgroup name'
[ doTest "string" IO.hPutStrLn str
, doTest "Text: putStrLn" TIO.hPutStrLn text
, doTest "Text: putStr" (\h t -> TIO.hPutStrLn h (T.snoc t '\n')) text
, doTest "say" hSay text
, doTest "sayString" hSayString str
, doTest "BS: putStrLn + encodeUtf8" (\h t -> S8.hPutStrLn h (TE.encodeUtf8 t)) text
, doTest "BS: putStr + encodeUtf8" (\h t -> S8.hPutStrLn h (S.snoc (TE.encodeUtf8 t) 10)) text
]
where
text = T.pack str
doTest name f x = bench name $ whnfIO $ do
f h x
IO.hFlush h