@@ -12,6 +12,7 @@
1212import Criterion.Main
1313import Data.ByteString (ByteString)
1414import Data.Int (Int64)
15+import Data.Maybe (fromMaybe)
1516
1617import qualified Data.ByteString as S
1718import qualified Data.ByteString.Char8 as B
@@ -19,6 +20,10 @@ import qualified Data.Char as C
1920import qualified Numeric as N
2021import qualified Test.QuickCheck as QC
2122
23+-- ReadInt is a module internal to Warp.
24+import qualified ReadInt as RI
25+
26+
2227import GHC.Prim
2328import GHC.Types
2429
@@ -38,6 +43,12 @@ readDec s =
3843 (x, _):_ -> x
3944
4045
46+-- Use ByteString's readInteger function (which requires some extra stuff to
47+-- slow us down).
48+readIntegerBS :: ByteString -> Integer
49+readIntegerBS bs = fst $ fromMaybe (0, "") $ B.readInteger bs
50+
51+
4152-- No checking for non-digits. Will overflow at 2^31 on 32 bit CPUs.
4253readIntRaw :: ByteString -> Int
4354readIntRaw =
@@ -102,6 +113,11 @@ mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
102113 \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
103114
104115
116+-- This is the one Warp actually uses.
117+readIntWarp :: ByteString -> Integer
118+readIntWarp s = fromIntegral $ RI.readInt64 s
119+
120+
105121-- A QuickCheck property. Test that for a number >= 0, converting it to
106122-- a string using show and then reading the value back with the function
107123-- under test returns the original value.
@@ -121,24 +137,28 @@ runQuickCheckTests = do
121137 QC.quickCheck (prop_read_show_idempotent readInteger)
122138 QC.quickCheck (prop_read_show_idempotent readInt64MH)
123139 QC.quickCheck (prop_read_show_idempotent readIntegerMH)
140+ QC.quickCheck (prop_read_show_idempotent readIntWarp)
141+
124142
125143runCriterionTests :: ByteString -> IO ()
126144runCriterionTests number =
127145 defaultMain
128146 [ bench "readIntOrig" $ nf readIntOrig number
129147 , bench "readDec" $ nf readDec number
148+ , bench "readIntegerBS" $ nf readIntegerBS number
130149 , bench "readRaw" $ nf readIntRaw number
131150 , bench "readInt" $ nf readInt number
132151 , bench "readInt64" $ nf readInt64 number
133152 , bench "readInteger" $ nf readInteger number
134153 , bench "readInt64MH" $ nf readInt64MH number
135154 , bench "readIntegerMH" $ nf readIntegerMH number
155+ , bench "readIntWarp" $ nf readIntWarp number
136156 ]
137157
138−
139158main :: IO ()
140159main = do
141160 putStrLn "Quickcheck tests."
142161 runQuickCheckTests
143162 putStrLn "Criterion tests."
144163 runCriterionTests "1234567898765432178979128361238162386182"
164+