Skip to content

Commit 277f0d2

Browse files
Decoding benchmark
1 parent bddf64d commit 277f0d2

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

bench/Codecs.hs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@ import Data.ByteString.Lazy (toStrict)
44
import Data.ByteString.Builder (toLazyByteString)
55
import Data.ByteString (ByteString)
66
import Data.Monoid
7+
import Data.Foldable
78
import System.IO.Unsafe
89
import Data.Vector as V(fromList, empty)
910
import Criterion.Main
1011
import Data.Time
1112
import Data.UUID
1213
import Data.UUID.V4 (nextRandom)
1314
import Data.Scientific
15+
import Data.Vector (Vector)
16+
import qualified Data.ByteString as B
1417

1518
import Database.PostgreSQL.Protocol.Types
1619
import Database.PostgreSQL.Protocol.Encoders
1720
import Database.PostgreSQL.Protocol.Store.Encode
1821
import Database.PostgreSQL.Protocol.Store.Decode
22+
import Database.PostgreSQL.Protocol.DataRows
1923
import qualified Database.PostgreSQL.Protocol.Codecs.Decoders as PD
2024
import qualified Database.PostgreSQL.Protocol.Codecs.Encoders as PE
2125
import 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

3344
type QueryParams
@@ -48,14 +59,23 @@ queryParams =
4859
testScientific :: Scientific
4960
testScientific = scientific 11111111111111 (-18)
5061

62+
testScientificEncoded :: ByteString
63+
testScientificEncoded = runEncode $ PE.numeric testScientific
64+
5165
{-# NOINLINE testUTCTime #-}
5266
testUTCTime :: UTCTime
5367
testUTCTime = unsafePerformIO getCurrentTime
5468

69+
testUTCTimeEncoded :: ByteString
70+
testUTCTimeEncoded = runEncode $ PE.timestamptz testUTCTime
71+
5572
{-# NOINLINE testUUID #-}
5673
testUUID :: UUID
5774
testUUID = unsafePerformIO nextRandom
5875

76+
testUUIDEncoded :: ByteString
77+
testUUIDEncoded = runEncode $ PE.uuid testUUID
78+
5979
encodeMessage :: QueryParams -> ByteString
6080
encodeMessage 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

bench/row.out

111 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)