|
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 |
]
|