packages feed

hw-json-0.8.0.0: bench/Main.hs

{-# LANGUAGE BangPatterns        #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import Criterion.Main
import Data.Word
import Foreign
import HaskellWorks.Data.BalancedParens.Simple
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.FromByteString
import HaskellWorks.Data.Json.Internal.Blank
import HaskellWorks.Data.Json.Internal.MakeIndex
import HaskellWorks.Data.Json.Succinct.Cursor.Internal
import System.IO.MMap

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

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 (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))
loadJson bs = fromByteString bs :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))

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

benchRankJson40 :: [Benchmark]
benchRankJson40 =
  [ env (setupEnvJson "corpus/part40.json") $ \bs -> bgroup "Json40"
    [ bench "Run blankJson                    "  (whnf (BS.concat . blankJson          ) [bs])
    , bench "Run jsonToInterestBits3          "  (whnf (BS.concat . jsonToInterestBits3) [bs])
    , bench "loadJson                         "  (whnf loadJson                           bs )
    ]
  ]

benchRankJson80 :: [Benchmark]
benchRankJson80 =
  [ env (setupEnvJson "corpus/part80.json") $ \bs -> bgroup "Json40"
    [ bench "Run blankJson                    "  (whnf (BS.concat . blankJson          ) [bs])
    , bench "Run jsonToInterestBits3          "  (whnf (BS.concat . jsonToInterestBits3) [bs])
    , bench "loadJson" (whnf loadJson bs)
    ]
  ]

benchRankJsonBig :: [Benchmark]
benchRankJsonBig =
  [ env (setupEnvJson "corpus/78mb.json") $ \bs -> bgroup "JsonBig"
    [ bench "Run blankJson                    "  (whnf (BS.concat . blankJson          ) [bs])
    , bench "Run jsonToInterestBits3          "  (whnf (BS.concat . jsonToInterestBits3) [bs])
    , bench "loadJson" (whnf loadJson bs)
    ]
  ]

main :: IO ()
main = defaultMain benchRankJson40