Skip to content

Commit 42d013a

Browse files
authored
Merge pull request #833 from phadej/escape-benchmark
Add escape function benchmarks into bench suite
2 parents 7f8b2fd + a9b4c21 commit 42d013a

File tree

3 files changed

+45
-59
lines changed

3 files changed

+45
-59
lines changed

benchmarks/aeson-benchmarks.cabal

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,21 +141,6 @@ executable aeson-benchmark-auto-compare
141141
, deepseq
142142
, template-haskell
143143

144-
executable aeson-benchmark-escape
145-
default-language: Haskell2010
146-
main-is: Escape.hs
147-
hs-source-dirs: bench examples/src
148-
ghc-options: -Wall -O2 -rtsopts
149-
build-depends:
150-
aeson-benchmarks
151-
, base
152-
, base-compat-batteries
153-
, bytestring
154-
, criterion >=1.0
155-
, deepseq
156-
, ghc-prim
157-
, text
158-
159144
executable aeson-benchmark-compare
160145
default-language: Haskell2010
161146
main-is: Compare.hs

benchmarks/bench/Escape.hs

Lines changed: 0 additions & 32 deletions
This file was deleted.

benchmarks/bench/Suite.hs

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
11
{-# LANGUAGE NoImplicitPrelude #-}
2+
{-# LANGUAGE OverloadedStrings #-}
23
{-# LANGUAGE ScopedTypeVariables #-}
34

45
module Main (main) where
56

67
import Data.Aeson
78
import Prelude.Compat
89

9-
import Control.DeepSeq (NFData)
10-
import Criterion.Main (Benchmark, bench, bgroup, defaultMain,
11-
env, nf)
12-
import Data.Maybe (fromMaybe)
13-
import Data.Proxy (Proxy (..))
14-
import Data.Vector (Vector)
15-
import System.Environment (lookupEnv)
16-
import System.FilePath ((</>))
10+
import Control.DeepSeq (NFData)
11+
import Criterion.Main (Benchmark, bench, bgroup,
12+
defaultMain, env, nf, whnf)
13+
import Data.Maybe (fromMaybe)
14+
import Data.Proxy (Proxy (..))
15+
import Data.Vector (Vector)
16+
import System.Environment (lookupEnv)
17+
import System.FilePath ((</>))
1718

18-
import qualified Data.ByteString as BS
19-
import qualified Data.ByteString.Lazy as LBS
19+
import qualified Data.Aeson.Encoding.Builder as Aeson.EB
20+
import qualified Data.Aeson.Parser.UnescapeFFI as FFI
21+
import qualified Data.Aeson.Parser.UnescapePure as Pure
22+
import qualified Data.ByteString as BS
23+
import qualified Data.ByteString.Char8 as BS8
24+
import qualified Data.ByteString.Lazy as LBS
25+
import qualified Data.Text as T
26+
import qualified Data.ByteString.Builder as B
2027

2128
import qualified Twitter
22-
import qualified Twitter.Manual ()
29+
import qualified Twitter.Manual ()
2330

2431
import qualified GitHub
2532

@@ -44,14 +51,39 @@ decodeBench name fp _ = bgroup name
4451
decS :: BS.ByteString -> Maybe a
4552
decS = decodeStrict
4653

54+
-------------------------------------------------------------------------------
55+
-- Escape bench
56+
-------------------------------------------------------------------------------
57+
58+
escapeBench :: Benchmark
59+
escapeBench = bgroup "Escape"
60+
[ example "ascii" $ BS8.pack $ take 500 $ cycle ['a'..'z']
61+
, example "cyrillic" $ LBS.toStrict $ B.toLazyByteString $ Aeson.EB.unquoted $ T.unwords
62+
[ "Стандарт состоит из двух основных частей: универсального набора "
63+
, "символов (англ. Universal character set, UCS) и семейства кодировок"
64+
, "(англ. Unicode transformation format, UTF). Универсальный набор"
65+
, "символов перечисляет допустимые по стандарту Юникод символы и"
66+
, "присваивает каждому символу код в виде неотрицательного целого"
67+
, "числа, записываемого обычно в шестнадцатеричной форме с префиксом"
68+
, "U+, например, U+040F. Семейство кодировок определяет способы"
69+
, "преобразования кодов символов для передачи в потоке или в файле."
70+
]
71+
]
72+
where
73+
example :: String -> BS.ByteString -> Benchmark
74+
example name input = bgroup name
75+
[ bench "ffi" $ whnf FFI.unescapeText input
76+
, bench "pure" $ whnf Pure.unescapeText input
77+
]
78+
4779
-------------------------------------------------------------------------------
4880
-- Helpers
4981
-------------------------------------------------------------------------------
5082

5183
readS :: FilePath -> IO BS.ByteString
5284
readS fp = do
5385
dataDir <- lookupEnv "AESON_BENCH_DATADIR"
54-
BS.readFile $ maybe id (</>) dataDir fp
86+
BS.readFile $ fromMaybe "json-data" dataDir </> fp
5587

5688
readL :: FilePath -> IO LBS.ByteString
5789
readL fp = do
@@ -71,4 +103,5 @@ main = defaultMain
71103
, decodeBench "github-issues" "github-issues.json" (Proxy :: Proxy (Vector GitHub.Issue))
72104
]
73105
]
106+
, escapeBench
74107
]

0 commit comments

Comments
 (0)