packages feed

tokenize-0.2.0: tests/src/Bench.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
module Bench where

import qualified Data.ByteString as BS
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE

import Control.DeepSeq
import Criterion.Main
import Criterion.Config (defaultConfig, Config(..), ljust)


import System.Environment (getArgs, withArgs)

import qualified NLP.Tokenize.String as StrTok
import qualified NLP.Tokenize.Text as TextTok


myConfig :: Config
myConfig = defaultConfig {
              -- Always GC between runs.
              cfgPerformGC = ljust True
            }

readF :: FilePath -> IO Text
readF file = do
  bs <- BS.readFile file
  return $ TE.decodeLatin1 bs

main :: IO ()
main = do
  args <- getArgs
  case args of
    [] -> putStrLn "Usage: bench <input_text_file>"
    (f:rest) -> do
      plugTxt <- mapM readF [f]
      let plugStr = map T.unpack plugTxt
      deepseq plugStr $ withArgs rest $ defaultMainWith myConfig (return ())
            [ bgroup "tokenizing"
              [ bench "Native String Tokenizer" $ nf (map StrTok.tokenize) plugStr
              , bench "Native Text Tokenizer" $ nf (map TextTok.tokenize) plugTxt
              , bench "Text->Text based on String Tokenizer" $ nf (map strTokenizer) plugTxt
              , bench "String->String based on Text Tokenizer" $ nf (map txtTokenizer) plugStr
              ]
            ]

strTokenizer :: Text -> [Text]
strTokenizer txt = map T.pack (StrTok.tokenize $ T.unpack txt)

txtTokenizer :: String -> [String]
txtTokenizer str = map T.unpack (TextTok.tokenize $ T.pack str)