@@ -4,18 +4,22 @@ import Data.ByteString.Lazy (toStrict)
44import Data.ByteString.Builder (toLazyByteString )
55import Data.ByteString (ByteString )
66import Data.Monoid
7+ import Data.Foldable
78import System.IO.Unsafe
89import Data.Vector as V (fromList , empty )
910import Criterion.Main
1011import Data.Time
1112import Data.UUID
1213import Data.UUID.V4 (nextRandom )
1314import Data.Scientific
15+ import Data.Vector (Vector )
16+ import qualified Data.ByteString as B
1417
1518import Database.PostgreSQL.Protocol.Types
1619import Database.PostgreSQL.Protocol.Encoders
1720import Database.PostgreSQL.Protocol.Store.Encode
1821import Database.PostgreSQL.Protocol.Store.Decode
22+ import Database.PostgreSQL.Protocol.DataRows
1923import qualified Database.PostgreSQL.Protocol.Codecs.Decoders as PD
2024import qualified Database.PostgreSQL.Protocol.Codecs.Encoders as PE
2125import qualified Database.PostgreSQL.Protocol.Codecs.PgTypes as PGT
@@ -27,7 +31,14 @@ main = defaultMain
2731 , bench " Scientific" $ nf (runEncode . PE. numeric) testScientific
2832 , bench " UTCTime" $ nf (runEncode . PE. timestamptz) testUTCTime
2933 , bench " UUID" $ nf (runEncode . PE. uuid) testUUID
30- ]
34+ ]
35+ , bgroup " Decoding"
36+ [ bench " Message" $ nf decodeMessage testDataRows
37+ , bench " Message as bytes" $ nf decodeMessageBytes testDataRows
38+ , bench " Scientific" $ nf (runDecode $ PD. numeric 0 ) testScientificEncoded
39+ , bench " UTCTime" $ nf (runDecode $ PD. timestamptz 0 ) testUTCTimeEncoded
40+ , bench " UUID" $ nf (runDecode $ PD. uuid 0 ) testUUIDEncoded
41+ ]
3142 ]
3243
3344type QueryParams
@@ -48,14 +59,23 @@ queryParams =
4859testScientific :: Scientific
4960testScientific = scientific 11111111111111 (- 18 )
5061
62+ testScientificEncoded :: ByteString
63+ testScientificEncoded = runEncode $ PE. numeric testScientific
64+
5165{-# NOINLINE testUTCTime #-}
5266testUTCTime :: UTCTime
5367testUTCTime = unsafePerformIO getCurrentTime
5468
69+ testUTCTimeEncoded :: ByteString
70+ testUTCTimeEncoded = runEncode $ PE. timestamptz testUTCTime
71+
5572{-# NOINLINE testUUID #-}
5673testUUID :: UUID
5774testUUID = unsafePerformIO nextRandom
5875
76+ testUUIDEncoded :: ByteString
77+ testUUIDEncoded = runEncode $ PE. uuid testUUID
78+
5979encodeMessage :: QueryParams -> ByteString
6080encodeMessage params = runEncode $
6181 encodeClientMessage parseMessage <> encodeClientMessage bindMessage
@@ -85,3 +105,37 @@ encodeMessage params = runEncode $
85105 , PGT. uuid
86106 ]
87107
108+ decodeMessage :: DataRows -> Vector QueryParams
109+ decodeMessage = decodeManyRows (PD. dataRowHeader *> decoder)
110+ where
111+ decoder = (,,,,,,)
112+ <$> PD. getNonNullable PD. bool
113+ <*> PD. getNonNullable PD. bytea
114+ <*> PD. getNonNullable PD. float8
115+ <*> PD. getNonNullable PD. interval
116+ <*> PD. getNonNullable PD. numeric
117+ <*> PD. getNonNullable PD. timestamptz
118+ <*> PD. getNonNullable PD. uuid
119+
120+ decodeMessageBytes
121+ :: DataRows
122+ -> Vector ( ByteString , ByteString , ByteString , ByteString , ByteString
123+ , ByteString , ByteString )
124+ decodeMessageBytes = decodeManyRows (PD. dataRowHeader *> decoder)
125+ where
126+ decoder = (,,,,,,)
127+ <$> PD. getNonNullable PD. bytea
128+ <*> PD. getNonNullable PD. bytea
129+ <*> PD. getNonNullable PD. bytea
130+ <*> PD. getNonNullable PD. bytea
131+ <*> PD. getNonNullable PD. bytea
132+ <*> PD. getNonNullable PD. bytea
133+ <*> PD. getNonNullable PD. bytea
134+
135+ {-# NOINLINE testDataRows #-}
136+ testDataRows :: DataRows
137+ testDataRows = DataRows chunk (DataRows chunk (DataRows chunk Empty ))
138+ where
139+ row = unsafePerformIO $ B. readFile " bench/row.out"
140+ rows = fold $ replicate 10 row
141+ chunk = DataChunk 10 rows
0 commit comments