packages feed

bytestring-encodings-0.1.0.0: benchmark/Main.hs

module Main (main) where

import Gauge.Main
import Data.ByteString.Ascii (isAscii)
import Data.ByteString.Utf8  (isUtf8)
import Data.ByteString (ByteString)
import qualified Data.List as L
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import qualified Data.Text.Encoding as TE

main :: IO ()
main = do
  let bs = BC.pack (L.take 50000 (L.cycle ['a'..'z']))
      bsAscii = bs
      bsUtf8  = BC.pack (L.take 50000 (L.cycle
        [ '¿', 'D', 'ó', 'n', 'd', 'e'
        ]))

  defaultMain
    [ 
      bgroup "ASCII: naive versus isAscii"
      [ bench "Data.ByteString.all" $ whnf standardIsAscii bs
      , bench "isAscii" $ whnf isAscii bs
      ]
    , bgroup "ASCII: Data.Text.Encoding.decodeUtf8 versus isUtf8" 
      [ bench "Data.Text.Encoding.decodeUtf8" $ whnf TE.decodeUtf8 bsAscii
      , bench "isUtf8" $ whnf isUtf8 bsAscii
      ]
    , bgroup "UTF-8: isUtf8"
      [ 
        bench "isUtf8" $ whnf isUtf8 bsUtf8 
      ]
    ]

standardIsAscii :: ByteString -> Bool
standardIsAscii bs = B.all (\x -> x < 127) bs