hw-json-0.9.0.0: bench/Main.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad
import Criterion.Main
import Data.List
import Data.Word
import Foreign
import HaskellWorks.Data.BalancedParens.Simple
import HaskellWorks.Data.FromByteString
import HaskellWorks.Data.Json.Cursor
import HaskellWorks.Data.Json.Internal.Blank
import HaskellWorks.Data.Json.Internal.MakeIndex
import System.IO.MMap
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BSI
import qualified Data.Vector.Storable as DVS
import qualified System.Directory as IO
setupEnvJson :: FilePath -> IO BS.ByteString
setupEnvJson filepath = do
(fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr filepath ReadOnly Nothing
let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size
return bs
loadJson :: BS.ByteString -> JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))
loadJson bs = fromByteString bs :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))
jsonToInterestBits3 :: [BS.ByteString] -> [BS.ByteString]
jsonToInterestBits3 = blankedJsonToInterestBits . blankJson
makeBenchBlankJson :: IO [Benchmark]
makeBenchBlankJson = do
entries <- IO.listDirectory "corpus/bench"
let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries
benchmarks <- forM files $ \file -> return
[ env (setupEnvJson file) $ \bs -> bgroup file
[ bench "Run blankJson" (whnf (BS.concat . blankJson) [bs])
]
]
return (join benchmarks)
makeBenchJsonToInterestBits :: IO [Benchmark]
makeBenchJsonToInterestBits = do
entries <- IO.listDirectory "corpus/bench"
let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries
benchmarks <- forM files $ \file -> return
[ env (setupEnvJson file) $ \bs -> bgroup file
[ bench "Run blankJson" (whnf (BS.concat . jsonToInterestBits3) [bs])
]
]
return (join benchmarks)
makeBenchLoadJson :: IO [Benchmark]
makeBenchLoadJson = do
entries <- IO.listDirectory "corpus/bench"
let files = ("corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries
benchmarks <- forM files $ \file -> return
[ env (setupEnvJson file) $ \bs -> bgroup file
[ bench "Run blankJson" (whnf loadJson bs)
]
]
return (join benchmarks)
main :: IO ()
main = do
benchmarks <- mconcat <$> sequence
[ makeBenchBlankJson
, makeBenchJsonToInterestBits
, makeBenchLoadJson
]
defaultMain benchmarks