1
1
{-# LANGUAGE NoImplicitPrelude #-}
2
+ {-# LANGUAGE OverloadedStrings #-}
2
3
{-# LANGUAGE ScopedTypeVariables #-}
3
4
4
5
module Main (main ) where
5
6
6
7
import Data.Aeson
7
8
import Prelude.Compat
8
9
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 ((</>) )
17
18
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
20
27
21
28
import qualified Twitter
22
- import qualified Twitter.Manual ()
29
+ import qualified Twitter.Manual ()
23
30
24
31
import qualified GitHub
25
32
@@ -44,14 +51,39 @@ decodeBench name fp _ = bgroup name
44
51
decS :: BS. ByteString -> Maybe a
45
52
decS = decodeStrict
46
53
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
+
47
79
-------------------------------------------------------------------------------
48
80
-- Helpers
49
81
-------------------------------------------------------------------------------
50
82
51
83
readS :: FilePath -> IO BS. ByteString
52
84
readS fp = do
53
85
dataDir <- lookupEnv " AESON_BENCH_DATADIR"
54
- BS. readFile $ maybe id ( </>) dataDir fp
86
+ BS. readFile $ fromMaybe " json-data " dataDir </> fp
55
87
56
88
readL :: FilePath -> IO LBS. ByteString
57
89
readL fp = do
@@ -71,4 +103,5 @@ main = defaultMain
71
103
, decodeBench " github-issues" " github-issues.json" (Proxy :: Proxy (Vector GitHub. Issue ))
72
104
]
73
105
]
106
+ , escapeBench
74
107
]
0 commit comments