1{-# LANGUAGE BangPatterns #-}
2{-# OPTIONS_GHC -fno-warn-deprecations #-}
3
4module Numbers (numbers) where
5
6import Criterion.Main (bench, bgroup, nf)
7import Criterion.Types (Benchmark)
8import Data.Scientific (Scientific(..))
9import Text.Parsec.Text ()
10import Text.Parsec.Text.Lazy ()
11import qualified Data.Attoparsec.ByteString.Char8 as AC
12import qualified Data.Attoparsec.Text as AT
13import qualified Data.ByteString.Char8 as BC
14import qualified Data.Text as T
15
16strN, strNePos, strNeNeg :: String
17strN     = "1234.56789"
18strNePos = "1234.56789e3"
19strNeNeg = "1234.56789e-3"
20
21numbers :: Benchmark
22numbers = bgroup "numbers" [
23  let !tN     = T.pack strN
24      !tNePos = T.pack strNePos
25      !tNeNeg = T.pack strNeNeg
26  in bgroup "Text"
27  [
28    bgroup "no power"
29    [ bench "double" $ nf (AT.parseOnly AT.double) tN
30    , bench "number" $ nf (AT.parseOnly AT.number) tN
31    , bench "rational" $
32      nf (AT.parseOnly (AT.rational :: AT.Parser Rational)) tN
33    , bench "scientific" $
34      nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tN
35    ]
36  , bgroup "positive power"
37    [ bench "double" $ nf (AT.parseOnly AT.double) tNePos
38    , bench "number" $ nf (AT.parseOnly AT.number) tNePos
39    , bench "rational" $
40      nf (AT.parseOnly (AT.rational :: AT.Parser Rational)) tNePos
41    , bench "scientific" $
42      nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tNePos
43    ]
44  , bgroup "negative power"
45    [ bench "double" $ nf (AT.parseOnly AT.double) tNeNeg
46    , bench "number" $ nf (AT.parseOnly AT.number) tNeNeg
47    , bench "rational" $
48      nf (AT.parseOnly (AT.rational :: AT.Parser Rational))  tNeNeg
49    , bench "scientific" $
50      nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tNeNeg
51    ]
52  ]
53  , let !bN     = BC.pack strN
54        !bNePos = BC.pack strNePos
55        !bNeNeg = BC.pack strNeNeg
56  in bgroup "ByteString"
57  [ bgroup "no power"
58    [ bench "double" $ nf (AC.parseOnly AC.double) bN
59    , bench "number" $ nf (AC.parseOnly AC.number) bN
60    , bench "rational" $
61      nf (AC.parseOnly (AC.rational :: AC.Parser Rational))   bN
62    , bench "scientific" $
63      nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bN
64    ]
65  , bgroup "positive power"
66    [ bench "double" $ nf (AC.parseOnly AC.double) bNePos
67    , bench "number" $ nf (AC.parseOnly AC.number) bNePos
68    , bench "rational" $
69      nf (AC.parseOnly (AC.rational :: AC.Parser Rational)) bNePos
70    , bench "scientific" $
71      nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bNePos
72    ]
73  , bgroup "negative power"
74    [ bench "double" $ nf (AC.parseOnly AC.double) bNeNeg
75    , bench "number" $ nf (AC.parseOnly AC.number) bNeNeg
76    , bench "rational" $
77      nf (AC.parseOnly (AC.rational :: AC.Parser Rational)) bNeNeg
78    , bench "scientific" $
79      nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bNeNeg
80    ]
81  ]
82 ]
83