module Main where import qualified Text.HTML.TagSoup.HT.Tag as Tag import qualified Text.HTML.TagSoup.HT.Parser as Parser import qualified Text.HTML.TagSoup.HT.Parser.Stream as Str import qualified Text.XML.Basic.Name.MixedCase as Name import System.Time (getClockTime, diffClockTimes, tdSec, tdPicosec, ) import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as BL measureTime :: String -> IO () -> IO () measureTime name act = do putStr (name++": ") timeA <- getClockTime act timeB <- getClockTime let td = diffClockTimes timeB timeA print (fromIntegral (tdSec td) + fromInteger (tdPicosec td) * 1e-12 :: Double) number :: Int number = 100000 main :: IO () main = do measureTime "String" $ print $ (last $ Parser.runSoup $ concat $ replicate number "
  • item
  • " :: Tag.T Name.T String) measureTime "ByteString.Strict" $ print $ (last $ Parser.runSoup $ BS.concat $ replicate number $ BS.pack "
  • item
  • " :: Tag.T Name.T String) measureTime "ByteString.Lazy" $ print $ (last $ Parser.runSoup $ BL.concat $ replicate number $ BL.pack "
  • item
  • " :: Tag.T Name.T String) measureTime "Pointer.Strict" $ print $ (last $ Parser.runSoup $ Str.pointerFromByteStringStrict $ BS.concat $ replicate number $ BS.pack "
  • item
  • " :: Tag.T Name.T String) measureTime "Pointer.Lazy" $ print $ (last $ Parser.runSoup $ Str.pointerFromByteStringLazy $ BL.concat $ replicate number $ BL.pack "
  • item
  • " :: Tag.T Name.T String) {- Results without inlining on euler: String: Close "li" 2.182197 ByteString.Strict: Close "li" 2.704024 ByteString.Lazy: Close "li" 3.203038 These figures remain, when Stream methods are inlined. Results without inlining on anubis: String: Close "li" 3.507383 ByteString.Strict: Close "li" 4.406978 ByteString.Lazy: Close "li" 5.266979 Pointer.Strict: Close "li" 3.37898 Pointer.Lazy: Close "li" 3.185808 The figures become worse, when MTL and Combinator functions are inlined, too: String: Close "li" 3.56803 ByteString.String: Close "li" 4.314474 ByteString.Lazy: Close "li" 4.855984 With the main parser functions inlined we get: tring: Close "li" 2.951519 ByteString.String: Close "li" 2.910444 ByteString.Lazy: Close "li" 3.046311 -}