{-# LANGUAGE BangPatterns #-} module Numbers (numbers) where import Criterion.Main (bench, bgroup, nf) import Criterion.Types (Benchmark) import Data.Scientific (Scientific(..)) import Text.Parsec.Text () import Text.Parsec.Text.Lazy () import qualified Data.Attoparsec.ByteString.Char8 as AC import qualified Data.Attoparsec.Text as AT import qualified Data.ByteString.Char8 as BC import qualified Data.Text as T strN, strNePos, strNeNeg :: String strN = "1234.56789" strNePos = "1234.56789e3" strNeNeg = "1234.56789e-3" numbers :: Benchmark numbers = bgroup "numbers" [ let !tN = T.pack strN !tNePos = T.pack strNePos !tNeNeg = T.pack strNeNeg in bgroup "Text" [ bgroup "no power" [ bench "double" $ nf (AT.parseOnly AT.double) tN , bench "number" $ nf (AT.parseOnly AT.number) tN , bench "rational" $ nf (AT.parseOnly (AT.rational :: AT.Parser Rational)) tN , bench "scientific" $ nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tN ] , bgroup "positive power" [ bench "double" $ nf (AT.parseOnly AT.double) tNePos , bench "number" $ nf (AT.parseOnly AT.number) tNePos , bench "rational" $ nf (AT.parseOnly (AT.rational :: AT.Parser Rational)) tNePos , bench "scientific" $ nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tNePos ] , bgroup "negative power" [ bench "double" $ nf (AT.parseOnly AT.double) tNeNeg , bench "number" $ nf (AT.parseOnly AT.number) tNeNeg , bench "rational" $ nf (AT.parseOnly (AT.rational :: AT.Parser Rational)) tNeNeg , bench "scientific" $ nf (AT.parseOnly (AT.rational :: AT.Parser Scientific)) tNeNeg ] ] , let !bN = BC.pack strN !bNePos = BC.pack strNePos !bNeNeg = BC.pack strNeNeg in bgroup "ByteString" [ bgroup "no power" [ bench "double" $ nf (AC.parseOnly AC.double) bN , bench "number" $ nf (AC.parseOnly AC.number) bN , bench "rational" $ nf (AC.parseOnly (AC.rational :: AC.Parser Rational)) bN , bench "scientific" $ nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bN ] , bgroup "positive power" [ bench "double" $ nf (AC.parseOnly AC.double) bNePos , bench "number" $ nf (AC.parseOnly AC.number) bNePos , bench "rational" $ nf (AC.parseOnly (AC.rational :: AC.Parser Rational)) bNePos , bench "scientific" $ nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bNePos ] , bgroup "negative power" [ bench "double" $ nf (AC.parseOnly AC.double) bNeNeg , bench "number" $ nf (AC.parseOnly AC.number) bNeNeg , bench "rational" $ nf (AC.parseOnly (AC.rational :: AC.Parser Rational)) bNeNeg , bench "scientific" $ nf (AC.parseOnly (AC.rational :: AC.Parser Scientific)) bNeNeg ] ] ]