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
-}