packages feed

json-syntax-0.1.2.0: bench/Main.hs

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

import Gauge.Main (defaultMain,bgroup,bench,whnf)

import Twitter100 (encodedTwitter100,byteStringTwitter100)

import qualified Data.Bytes as Bytes
import qualified Data.Bytes.Builder as BLDR
import qualified Data.Bytes.Chunks as Chunks
import qualified Data.ByteString.Lazy as LBS
import qualified Json as J
import qualified Data.Aeson as Aeson

main :: IO ()
main = do
  valueTwitter100 <- case J.decode (Bytes.fromByteArray encodedTwitter100) of
    Left _ -> fail "json-syntax failed to decode twitter-100"
    Right v -> pure v
  aesonValueTwitter100 <- case Aeson.decodeStrict' byteStringTwitter100 of
    Nothing -> fail "aeson failed to decode twitter-100"
    Just (v :: Aeson.Value) -> pure v
  defaultMain
    [ bgroup "json"
      [ bgroup "twitter"
        [ bgroup "100"
          [ bench "decode" $ whnf
              (\b -> J.decode (Bytes.fromByteArray b))
              encodedTwitter100
          , bench "encode" $ whnf
              (\v -> Chunks.length (BLDR.run 128 (J.encode v)))
              valueTwitter100
          ]
        ]
      ]
    , bgroup "aeson"
      [ bgroup "twitter"
        [ bgroup "100"
          [ bench "decode"
              (whnf (Aeson.decodeStrict' @Aeson.Value) byteStringTwitter100)
          , bench "encode" $ whnf
              (\v -> LBS.length (Aeson.encode v))
              aesonValueTwitter100
          ]
        ]
      ]
    ]