|
Packit |
9a2dfb |
{-# LANGUAGE OverloadedStrings #-}
|
|
Packit |
9a2dfb |
{-# LANGUAGE PackageImports #-}
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
module Main (main) where
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
import Criterion.Main
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
import Prelude ()
|
|
Packit |
9a2dfb |
import Prelude.Compat
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
import Data.Foldable (toList)
|
|
Packit |
9a2dfb |
import qualified "aeson" Data.Aeson as A
|
|
Packit |
9a2dfb |
import qualified "aeson-benchmarks" Data.Aeson as B
|
|
Packit |
9a2dfb |
import qualified Data.Sequence as S
|
|
Packit |
9a2dfb |
import qualified Data.Vector as V
|
|
Packit |
9a2dfb |
import qualified Data.Vector.Unboxed as U
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
-- List
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
newtype L f = L { getL :: f Int }
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
instance Foldable f => B.ToJSON (L f) where
|
|
Packit |
9a2dfb |
toJSON = error "do not use this"
|
|
Packit |
9a2dfb |
toEncoding = B.toEncoding . toList . getL
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
instance Foldable f => A.ToJSON (L f) where
|
|
Packit |
9a2dfb |
toJSON = error "do not use this"
|
|
Packit |
9a2dfb |
toEncoding = A.toEncoding . toList . getL
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
-- Foldable
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
newtype F f = F { getF :: f Int }
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
instance Foldable f => B.ToJSON (F f) where
|
|
Packit |
9a2dfb |
toJSON = error "do not use this"
|
|
Packit |
9a2dfb |
toEncoding = B.foldable . getF
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
instance Foldable f => A.ToJSON (F f) where
|
|
Packit |
9a2dfb |
toJSON = error "do not use this"
|
|
Packit |
9a2dfb |
toEncoding = A.foldable . getF
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
-- Values
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
valueList :: [Int]
|
|
Packit |
9a2dfb |
valueList = [1..1000]
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
valueSeq :: S.Seq Int
|
|
Packit |
9a2dfb |
valueSeq = S.fromList valueList
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
valueVector :: V.Vector Int
|
|
Packit |
9a2dfb |
valueVector = V.fromList valueList
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
valueUVector :: U.Vector Int
|
|
Packit |
9a2dfb |
valueUVector = U.fromList valueList
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
-- Main
|
|
Packit |
9a2dfb |
-------------------------------------------------------------------------------
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
benchEncodeA
|
|
Packit |
9a2dfb |
:: A.ToJSON a
|
|
Packit |
9a2dfb |
=> String
|
|
Packit |
9a2dfb |
-> a
|
|
Packit |
9a2dfb |
-> Benchmark
|
|
Packit |
9a2dfb |
benchEncodeA name val
|
|
Packit |
9a2dfb |
= bench ("A " ++ name) $ nf A.encode val
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
benchEncodeB
|
|
Packit |
9a2dfb |
:: B.ToJSON a
|
|
Packit |
9a2dfb |
=> String
|
|
Packit |
9a2dfb |
-> a
|
|
Packit |
9a2dfb |
-> Benchmark
|
|
Packit |
9a2dfb |
benchEncodeB name val
|
|
Packit |
9a2dfb |
= bench ("B " ++ name) $ nf B.encode val
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
main :: IO ()
|
|
Packit |
9a2dfb |
main = defaultMain
|
|
Packit |
9a2dfb |
[ bgroup "encode"
|
|
Packit |
9a2dfb |
[ bgroup "List"
|
|
Packit |
9a2dfb |
[ benchEncodeB "-" valueList
|
|
Packit |
9a2dfb |
, benchEncodeB "L" $ L valueList
|
|
Packit |
9a2dfb |
, benchEncodeB "F" $ F valueList
|
|
Packit |
9a2dfb |
, benchEncodeA "-" valueList
|
|
Packit |
9a2dfb |
, benchEncodeA "L" $ L valueList
|
|
Packit |
9a2dfb |
, benchEncodeA "F" $ F valueList
|
|
Packit |
9a2dfb |
]
|
|
Packit |
9a2dfb |
, bgroup "Seq"
|
|
Packit |
9a2dfb |
[ benchEncodeB "-" valueSeq
|
|
Packit |
9a2dfb |
, benchEncodeB "L" $ L valueSeq
|
|
Packit |
9a2dfb |
, benchEncodeB "F" $ F valueSeq
|
|
Packit |
9a2dfb |
, benchEncodeA "-" valueSeq
|
|
Packit |
9a2dfb |
, benchEncodeA "L" $ L valueSeq
|
|
Packit |
9a2dfb |
, benchEncodeA "F" $ F valueSeq
|
|
Packit |
9a2dfb |
]
|
|
Packit |
9a2dfb |
, bgroup "Vector"
|
|
Packit |
9a2dfb |
[ benchEncodeB "-" valueVector
|
|
Packit |
9a2dfb |
, benchEncodeB "L" $ L valueVector
|
|
Packit |
9a2dfb |
, benchEncodeB "F" $ F valueVector
|
|
Packit |
9a2dfb |
, benchEncodeA "-" valueVector
|
|
Packit |
9a2dfb |
, benchEncodeA "L" $ L valueVector
|
|
Packit |
9a2dfb |
, benchEncodeA "F" $ F valueVector
|
|
Packit |
9a2dfb |
]
|
|
Packit |
9a2dfb |
, bgroup "Vector.Unboxed"
|
|
Packit |
9a2dfb |
[ benchEncodeB "-" valueUVector
|
|
Packit |
9a2dfb |
, benchEncodeA "-" valueUVector
|
|
Packit |
9a2dfb |
]
|
|
Packit |
9a2dfb |
]
|
|
Packit |
9a2dfb |
]
|