8000 Decoding benchmark · postgres-haskell/postgres-wire@277f0d2 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

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)
0