packages feed

succinct-0.0.0.1: components/succinct-json-standard-cursor/bench/Main.hs

{-# LANGUAGE BangPatterns        #-}

module Main where

import Control.Monad
import Criterion.Main
import Data.List
import Data.Succinct.Json.Standard.Cursor.Internal.Blank
import Data.Succinct.Json.Standard.Cursor.Internal.MakeIndex
import Data.Word
import Foreign
import System.IO.MMap

import qualified Data.ByteString                         as BS
import qualified Data.ByteString.Internal                as BSI
import qualified Data.Succinct.Json.Standard.Cursor.Fast as FAST
import qualified Data.Succinct.Json.Standard.Cursor.Slow as SLOW
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

jsonToInterestBits3 :: [BS.ByteString] -> [BS.ByteString]
jsonToInterestBits3 = blankedJsonToInterestBits . blankJson

makeBenchBlankJson :: IO [Benchmark]
makeBenchBlankJson = do
  entries <- IO.listDirectory "components/succinct-json-standard-cursor/corpus/bench"
  let files = ("components/succinct-json-standard-cursor/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 "components/succinct-json-standard-cursor/corpus/bench"
  let files = ("components/succinct-json-standard-cursor/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)

makeBenchMakeCursor :: IO [Benchmark]
makeBenchMakeCursor = do
  entries <- IO.listDirectory "components/succinct-json-standard-cursor/corpus/bench"
  let files = ("components/succinct-json-standard-cursor/corpus/bench/" ++) <$> (".json" `isSuffixOf`) `filter` entries
  benchmarks <- forM files $ \file -> return
    [ env (setupEnvJson file) $ \bs -> bgroup file
      [ bench "Run slow make cursor" (whnf SLOW.fromByteString bs)
      , bench "Run fast make cursor" (whnf FAST.fromByteString bs)
      ]
    ]

  return (join benchmarks)

main :: IO ()
main = do
  benchmarks <- fmap mconcat $ sequence $ mempty
    <> [makeBenchBlankJson]
    <> [makeBenchJsonToInterestBits]
    <> [makeBenchMakeCursor]
  defaultMain benchmarks