packages feed

succinct-0.0.0.1: components/succinct-xml/bench/Main.hs

{-# LANGUAGE BangPatterns #-}

{- HLINT ignore "Use ++" -}

module Main where

import Criterion.Main
import Data.ByteString                         (ByteString)
import Data.Succinct.BalancedParens.Simple
import Data.Succinct.Xml.Internal.Blank
import Data.Succinct.Xml.Internal.List
import Data.Succinct.Xml.Internal.Tables
import Data.Succinct.Xml.Succinct.Cursor
import Data.Word
import Foreign
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.FromByteString
import System.IO.MMap

import qualified Data.ByteString          as BS
import qualified Data.ByteString.Internal as BSI
import qualified Data.Vector.Storable     as DVS

setupEnvXml :: FilePath -> IO ByteString
setupEnvXml filepath = do
  (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr filepath ReadOnly Nothing
  let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size
  return bs

loadXml :: ByteString -> XmlCursor ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))
loadXml bs = fromByteString bs :: XmlCursor ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))

xmlToInterestBits3 :: [ByteString] -> [ByteString]
xmlToInterestBits3 = blankedXmlToInterestBits . blankXml

runCon :: ([i] -> [ByteString]) -> i -> ByteString
runCon con bs = BS.concat $ con [bs]

benchRankXmlCatalogLists :: [Benchmark]
benchRankXmlCatalogLists =
  [ env (setupEnvXml "components/succinct-xml/data/catalog.xml") $ \bs -> bgroup "catalog.xml"
    [ bench "Run blankXml"            (whnf (runCon blankXml          ) bs)
    , bench "Run xmlToInterestBits3"  (whnf (runCon xmlToInterestBits3) bs)
    , bench "loadXml"                 (whnf loadXml                     bs)
    ]
  ]

setupInterestingWord8s :: IO ()
setupInterestingWord8s = do
  let !_ = interestingWord8s
  return ()

benchIsInterestingWord8 :: [Benchmark]
benchIsInterestingWord8 =
  [ env setupInterestingWord8s $ \_ -> bgroup "Interesting Word8 lookup"
    [ bench "isInterestingWord8"  (whnf isInterestingWord8 0)
    ]
  ]

main :: IO ()
main = defaultMain $ concat
  [ benchIsInterestingWord8
  , benchRankXmlCatalogLists
  ]