Blame bench/count-chars.hs

Packit de35d7
import Criterion.Main
Packit de35d7
import qualified Data.Text as T
Packit de35d7
import qualified Data.Text.Lazy as TL
Packit de35d7
import qualified Data.Text.Lazy.Encoding as TLE
Packit de35d7
import qualified Data.ByteString as S
Packit de35d7
import qualified Data.ByteString.Lazy as L
Packit de35d7
import Data.ByteString.Lazy.Internal (ByteString (..))
Packit de35d7
import Data.Streaming.Text
Packit de35d7
Packit de35d7
calcLen :: (S.ByteString -> DecodeResult)
Packit de35d7
        -> L.ByteString
Packit de35d7
        -> Int
Packit de35d7
calcLen =
Packit de35d7
    loop 0
Packit de35d7
  where
Packit de35d7
    loop total _ Empty = total
Packit de35d7
    loop total dec (Chunk bs bss) =
Packit de35d7
        total' `seq` loop total' dec' bss
Packit de35d7
      where
Packit de35d7
        DecodeResultSuccess t dec' = dec bs
Packit de35d7
        total' = total + T.length t
Packit de35d7
Packit de35d7
handleEncoding :: ( String
Packit de35d7
                  , TL.Text -> L.ByteString
Packit de35d7
                  , L.ByteString -> TL.Text
Packit de35d7
                  , S.ByteString -> DecodeResult
Packit de35d7
                  )
Packit de35d7
               -> Benchmark
Packit de35d7
handleEncoding (name, encodeLazy, decodeLazy, decodeStream) = bgroup name
Packit de35d7
    [ bench "lazy" $ whnf (TL.length . decodeLazy) lbs
Packit de35d7
    , bench "stream" $ whnf (calcLen decodeStream) lbs
Packit de35d7
    ]
Packit de35d7
  where
Packit de35d7
    text = TL.pack $ concat $ replicate 10 ['\27'..'\2003']
Packit de35d7
    lbs = encodeLazy text
Packit de35d7
Packit de35d7
main :: IO ()
Packit de35d7
main = defaultMain $ map handleEncoding
Packit de35d7
    [ ("UTF-8", TLE.encodeUtf8, TLE.decodeUtf8, decodeUtf8)
Packit de35d7
    , ("UTF-8 pure", TLE.encodeUtf8, TLE.decodeUtf8, decodeUtf8Pure)
Packit de35d7
    , ("UTF-16LE", TLE.encodeUtf16LE, TLE.decodeUtf16LE, decodeUtf16LE)
Packit de35d7
    , ("UTF-16BE", TLE.encodeUtf16BE, TLE.decodeUtf16BE, decodeUtf16BE)
Packit de35d7
    , ("UTF-32LE", TLE.encodeUtf32LE, TLE.decodeUtf32LE, decodeUtf32LE)
Packit de35d7
    , ("UTF-32BE", TLE.encodeUtf32BE, TLE.decodeUtf32BE, decodeUtf32BE)
Packit de35d7
    ]