Blame benchmarks/CompareWithJSON.hs

Packit 9a2dfb
{-# LANGUAGE PackageImports #-}
Packit 9a2dfb
{-# OPTIONS_GHC -fno-warn-orphans #-}
Packit 9a2dfb
Packit 9a2dfb
module Main (main) where
Packit 9a2dfb
Packit 9a2dfb
import Prelude ()
Packit 9a2dfb
import Prelude.Compat
Packit 9a2dfb
Packit 9a2dfb
import Blaze.ByteString.Builder (toLazyByteString)
Packit 9a2dfb
import Blaze.ByteString.Builder.Char.Utf8 (fromString)
Packit 9a2dfb
import Control.DeepSeq (NFData(rnf))
Packit 9a2dfb
import Criterion.Main
Packit 9a2dfb
import Data.Maybe (fromMaybe)
Packit 9a2dfb
import qualified "aeson-benchmarks" Data.Aeson as A
Packit 9a2dfb
import qualified "aeson-benchmarks" Data.Aeson.Text as A
Packit 9a2dfb
import qualified "aeson-benchmarks" Data.Aeson.Parser.Internal as I
Packit 9a2dfb
import qualified "aeson" Data.Aeson as B
Packit 9a2dfb
import qualified Data.ByteString as BS
Packit 9a2dfb
import qualified Data.ByteString.Lazy as BL
Packit 9a2dfb
import qualified Data.Text.Lazy          as TL
Packit 9a2dfb
import qualified Data.Text.Lazy.Builder  as TLB
Packit 9a2dfb
import qualified Data.Text.Lazy.Encoding as TLE
Packit 9a2dfb
import qualified Text.JSON as J
Packit 9a2dfb
Packit 9a2dfb
instance (NFData v) => NFData (J.JSObject v) where
Packit 9a2dfb
  rnf o = rnf (J.fromJSObject o)
Packit 9a2dfb
Packit 9a2dfb
instance NFData J.JSValue where
Packit 9a2dfb
  rnf J.JSNull = ()
Packit 9a2dfb
  rnf (J.JSBool b) = rnf b
Packit 9a2dfb
  rnf (J.JSRational a b) = rnf a `seq` rnf b `seq` ()
Packit 9a2dfb
  rnf (J.JSString s) = rnf (J.fromJSString s)
Packit 9a2dfb
  rnf (J.JSArray lst) = rnf lst
Packit 9a2dfb
  rnf (J.JSObject o) = rnf o
Packit 9a2dfb
Packit 9a2dfb
decodeJ :: String -> J.JSValue
Packit 9a2dfb
decodeJ s =
Packit 9a2dfb
  case J.decodeStrict s of
Packit 9a2dfb
    J.Ok v -> v
Packit 9a2dfb
    J.Error _ -> error "fail to parse via JSON"
Packit 9a2dfb
Packit 9a2dfb
decodeA :: BL.ByteString -> A.Value
Packit 9a2dfb
decodeA s = fromMaybe (error "fail to parse via Aeson") $ A.decode s
Packit 9a2dfb
Packit 9a2dfb
decodeA' :: BL.ByteString -> A.Value
Packit 9a2dfb
decodeA' s = fromMaybe (error "fail to parse via Aeson") $ A.decode' s
Packit 9a2dfb
Packit 9a2dfb
decodeAS :: BS.ByteString -> A.Value
Packit 9a2dfb
decodeAS s = fromMaybe (error "fail to parse via Aeson") $ A.decodeStrict' s
Packit 9a2dfb
Packit 9a2dfb
decodeB :: BL.ByteString -> B.Value
Packit 9a2dfb
decodeB s = fromMaybe (error "fail to parse via Aeson") $ B.decode s
Packit 9a2dfb
Packit 9a2dfb
decodeBS :: BS.ByteString -> B.Value
Packit 9a2dfb
decodeBS s = fromMaybe (error "fail to parse via Aeson") $ B.decodeStrict' s
Packit 9a2dfb
Packit 9a2dfb
decodeIP :: BL.ByteString -> A.Value
Packit 9a2dfb
decodeIP s = fromMaybe (error "fail to parse via Parser.decodeWith") $
Packit 9a2dfb
    I.decodeWith I.jsonEOF A.fromJSON s
Packit 9a2dfb
Packit 9a2dfb
encodeJ :: J.JSValue -> BL.ByteString
Packit 9a2dfb
encodeJ = toLazyByteString . fromString . J.encode
Packit 9a2dfb
Packit 9a2dfb
encodeToText :: A.Value -> TL.Text
Packit 9a2dfb
encodeToText = TLB.toLazyText . A.encodeToTextBuilder . A.toJSON
Packit 9a2dfb
Packit 9a2dfb
encodeViaText :: A.Value -> BL.ByteString
Packit 9a2dfb
encodeViaText = TLE.encodeUtf8 . encodeToText
Packit 9a2dfb
Packit 9a2dfb
main :: IO ()
Packit 9a2dfb
main = do
Packit 9a2dfb
  let enFile = "json-data/twitter100.json"
Packit 9a2dfb
      jpFile = "json-data/jp100.json"
Packit 9a2dfb
  enA <- BL.readFile enFile
Packit 9a2dfb
  enS <- BS.readFile enFile
Packit 9a2dfb
  enJ <- readFile enFile
Packit 9a2dfb
  jpA <- BL.readFile jpFile
Packit 9a2dfb
  jpS <- BS.readFile jpFile
Packit 9a2dfb
  jpJ <- readFile jpFile
Packit 9a2dfb
  defaultMain [
Packit 9a2dfb
      bgroup "decode" [
Packit 9a2dfb
        bgroup "en" [
Packit 9a2dfb
          bench "aeson/lazy"     $ nf decodeA enA
Packit 9a2dfb
        , bench "aeson/strict"   $ nf decodeA' enA
Packit 9a2dfb
        , bench "aeson/stricter" $ nf decodeAS enS
Packit 9a2dfb
        , bench "aeson/hackage"  $ nf decodeB enA
Packit 9a2dfb
        , bench "aeson/hackage'" $ nf decodeBS enS
Packit 9a2dfb
        , bench "aeson/parser"   $ nf decodeIP enA
Packit 9a2dfb
        , bench "json"           $ nf decodeJ enJ
Packit 9a2dfb
        ]
Packit 9a2dfb
      , bgroup "jp" [
Packit 9a2dfb
          bench "aeson"          $ nf decodeA jpA
Packit 9a2dfb
        , bench "aeson/stricter" $ nf decodeAS jpS
Packit 9a2dfb
        , bench "aeson/hackage"  $ nf decodeB jpA
Packit 9a2dfb
        , bench "json"           $ nf decodeJ jpJ
Packit 9a2dfb
        ]
Packit 9a2dfb
      ]
Packit 9a2dfb
    , bgroup "encode" [
Packit 9a2dfb
        bgroup "en" [
Packit 9a2dfb
          bench "aeson-to-bytestring" $ nf A.encode (decodeA enA)
Packit 9a2dfb
        , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA enA)
Packit 9a2dfb
        , bench "aeson-to-text" $ nf encodeToText (decodeA enA)
Packit 9a2dfb
        , bench "json"  $ nf encodeJ (decodeJ enJ)
Packit 9a2dfb
        ]
Packit 9a2dfb
      , bgroup "jp" [
Packit 9a2dfb
          bench "aeson-to-bytestring" $ nf A.encode (decodeA jpA)
Packit 9a2dfb
        , bench "aeson-via-text-to-bytestring" $ nf encodeViaText (decodeA jpA)
Packit 9a2dfb
        , bench "aeson-to-text" $ nf encodeToText (decodeA jpA)
Packit 9a2dfb
        , bench "json"  $ nf encodeJ (decodeJ jpJ)
Packit 9a2dfb
        ]
Packit 9a2dfb
      ]
Packit 9a2dfb
    ]