import Text.HTML.Scalpel import Control.Applicative ((<$>)) import Control.Monad (replicateM_) import Criterion.Main (bgroup, bench, defaultMain, nf) import qualified Data.Text as T main :: IO () main = do let nested100 = makeNested 100 let nested1000 = makeNested 1000 let nested10000 = makeNested 10000 defaultMain [ bgroup "nested" [ bench "100" $ nf sumListTags nested100 , bench "1000" $ nf sumListTags nested1000 , bench "10000" $ nf sumListTags nested10000 ] , bgroup "many-selects" [ bench "10" $ nf (manySelects 10) nested1000 , bench "100" $ nf (manySelects 100) nested1000 , bench "1000" $ nf (manySelects 1000) nested1000 ] ] makeNested :: Int -> T.Text makeNested i = T.concat [T.replicate i open, one, T.replicate i close] where open = T.pack "" close = T.pack "" one = T.pack "1" sumListTags :: T.Text -> Maybe Integer sumListTags testData = scrapeStringLike testData $ (sum . map (const 1)) <$> texts "tag" manySelects :: Int -> T.Text -> Maybe () manySelects i testData = scrapeStringLike testData $ replicateM_ i $ texts "tag"