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