Skip to content

Commit 43f505b

Browse files
Adds serialization microbenchmark (#37)
1 parent ad02fdd commit 43f505b

File tree

11 files changed

+152
-1
lines changed

11 files changed

+152
-1
lines changed

benchmark/Main.hs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{-# LANGUAGE BangPatterns #-}
2+
{-# LANGUAGE ScopedTypeVariables #-}
3+
{-# LANGUAGE TypeApplications #-}
4+
5+
module Main (main) where
6+
7+
import Bitcoin (Block, Tx, decodeHex)
8+
import Control.DeepSeq (NFData)
9+
import Criterion (Benchmark, bench, bgroup, nf)
10+
import Criterion.Main (defaultMain)
11+
import Data.Bifunctor (bimap)
12+
import Data.Binary (Binary)
13+
import qualified Data.Binary as Bin
14+
import Data.ByteString (ByteString)
15+
import qualified Data.ByteString.Lazy as BSL
16+
import Data.Proxy (Proxy (..))
17+
import Data.Serialize (Serialize)
18+
import qualified Data.Serialize as S
19+
import Data.Text (Text)
20+
import qualified Data.Text as Text
21+
import qualified Data.Text.IO as TIO
22+
23+
24+
main :: IO ()
25+
main = do
26+
-- BLOCKS
27+
blockA <- TIO.readFile "data/block-758000.dat"
28+
blockB <- TIO.readFile "data/block-758100.dat"
29+
blockC <- TIO.readFile "data/block-758200.dat"
30+
let benchBlocks =
31+
bgroup
32+
"blocks"
33+
[ roundTrip (Proxy @Block) "block 758000" blockA
34+
, roundTrip (Proxy @Block) "block 758100" blockB
35+
, roundTrip (Proxy @Block) "block 758200" blockC
36+
]
37+
38+
-- TRANSACTIONS
39+
txA <- TIO.readFile "data/tx-A.dat"
40+
txB <- TIO.readFile "data/tx-B.dat"
41+
txC <- TIO.readFile "data/tx-C.dat"
42+
let benchTxs =
43+
bgroup
44+
"transactions"
45+
[ roundTrip (Proxy @Tx) "tx A" txA
46+
, roundTrip (Proxy @Tx) "tx B" txB
47+
, roundTrip (Proxy @Tx) "tx C" txC
48+
]
49+
50+
defaultMain
51+
[ bgroup
52+
"serialization"
53+
[ benchBlocks
54+
, benchTxs
55+
]
56+
]
57+
58+
59+
roundTrip ::
60+
forall a.
61+
(NFData a, Binary a, Serialize a) =>
62+
Proxy a ->
63+
String ->
64+
Text ->
65+
Benchmark
66+
roundTrip _ label xHex =
67+
bgroup
68+
label
69+
[ bgroup
70+
"binary"
71+
[ bench "encode" $ nf Bin.encode x
72+
, bench "decode" $ nf binDecode xBytes
73+
]
74+
, bgroup
75+
"cereal"
76+
[ bench "encode" $ nf S.encode x
77+
, bench "decode" $ nf (S.decode @a) xBytes
78+
]
79+
]
80+
where
81+
Just !xBytes = decodeHex $ Text.filter (/= '\n') xHex
82+
Right !x = binDecode xBytes
83+
84+
binDecode :: Binary a => ByteString -> Either String a
85+
binDecode = bimap pr3 pr3 . Bin.decodeOrFail . BSL.fromStrict
86+
pr3 (_, _, z) = z

bitcoin.cabal

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ extra-source-files:
3434
data/sig_nonstrict.json
3535
data/sig_strict.json
3636
data/sighash.json
37+
data/block-758000.dat
38+
data/block-758100.dat
39+
data/block-758200.dat
40+
data/block-758300.dat
41+
data/tx-A.dat
42+
data/tx-B.dat
43+
data/tx-C.dat
3744
README.md
3845
CHANGELOG.md
3946

@@ -179,3 +186,42 @@ test-suite spec
179186
, vector >=0.12.1.2
180187
default-language: Haskell2010
181188
build-tool-depends: hspec-discover:hspec-discover
189+
190+
benchmark benchmark
191+
type: exitcode-stdio-1.0
192+
main-is: Main.hs
193+
other-modules:
194+
Paths_bitcoin
195+
hs-source-dirs:
196+
benchmark
197+
build-depends:
198+
QuickCheck >=2.13.2
199+
, array >=0.5.4.0
200+
, base >=4.9 && <5
201+
, base16 >=0.3.0.1
202+
, binary >=0.8.8
203+
, bitcoin
204+
, bytes >=0.17
205+
, bytestring >=0.10.10.0
206+
, cereal >=0.5.8
207+
, containers >=0.6.2.1
208+
, criterion >=1.5 && <1.7
209+
, cryptonite >=0.26
210+
, deepseq >=1.4.4.0
211+
, entropy >=0.4.1.5
212+
, hashable >=1.3.0.0
213+
, hspec >=2.7.1
214+
, memory >=0.15.0
215+
, murmur3 >=1.0.3
216+
, network >=3.1.1.1
217+
, safe >=0.3.18
218+
, scientific >=0.3.6.2
219+
, secp256k1-haskell >=0.4.0
220+
, split >=0.2.3.3
221+
, string-conversions >=0.4.0.1
222+
, text >=1.2.3.0
223+
, time >=1.9.3
224+
, transformers >=0.5.6.2
225+
, unordered-containers >=0.2.10.0
226+
, vector >=0.12.1.2
227+
default-language: Haskell2010

data/block-758000.dat

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/block-758100.dat

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/block-758200.dat

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/block-758300.dat

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

data/tx-A.dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
02000000000102dd1577db73c41101e7c67cd1b0a8bcd878d501c64640c6813c4deabf9cde073502000000171600140736f801dfe253a5fbcae757740312f5767e6a70feffffffdb7c5d79bb8c48585e63376438daf7b178cb7c8680bbab154470a4469b07236003000000171600140736f801dfe253a5fbcae757740312f5767e6a70feffffff02c004770000000000160014e4e2ba9fd8306fb0cd0de18c6392352e9f0381a5845b22000000000017a914f1566e36b3f375ab5c789a587ed680bd0bf48b448702483045022100d5c815bec8731aa488d17d6be95b6a1e83514187d81a75989ce334034046d2e002200c2b9cbe83719065f7cc2818d13c74ed0d486dfede24dc6a8d1f37c96650500401210265073eafd8007a4facd5b1fc7eb39d0a6ad9bd476389a50b9a83367b7e71274c02483045022100b85d5f2f5c8ecf72693fe10aa5627d0cb5d5d5cb4dbf88c437182bed7b24f75e022042ef1c1391ad03f6e3bc64cd82ef41538bea52339936c856f894f4a4f565cfa901210265073eafd8007a4facd5b1fc7eb39d0a6ad9bd476389a50b9a83367b7e71274c00000000

data/tx-B.dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
010000000001074ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d0375791007000000171600148130903f392f800fbe683183a514943ca7165ae2ffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d037579100900000017160014a83ef0cffa062c897e0a9f853b94623c5148fdd2ffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d03757910050000001716001404da1e9c634bc5a4abbbef08683d602826eb7bbcffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d037579100800000017160014f96cb4f912a13434f81714379c5f7e326d9d6030ffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d037579100600000017160014c647817ed0ceb4129adbb67ce46fbb5b0891d861ffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d037579100200000017160014c1d2de3c6eb2f5d759738e0c93c3de4e1be376d8ffffffff4ff9ef75e62d9d5c5cb89edf430b236b02ba7c0291a5f8a350baed1d037579100400000017160014bab3b67e97cbdd59f4df806adcc2bc6183b1e191ffffffff10c38b59020000000017a9141fc1d097f43ea12401a795d2c66ba6568e2a847587425ec8050000000017a914ed3bea4863b171256d3ccae5345220837a891c5d8768ee55020000000017a91485ca478d5572272317ea27f66097d461c10e3e638714e2dd040000000017a91442e76050b861184a66459e26452f30e1a686e73387fb0dce040000000017a914f3b67fdab3d07baacb2dbd3f6285c858fdddd43a8737ba37040000000017a9140238447f250b44bc1163c297fce20b42ad4afa6787f23bdc040000000017a9147a7e1fd349fa023a91d3a02f4e10327250a45b1d87c9aed8030000000017a914fce24e7040c4ae5984f2356e0392a4cecbf23f8d87c4fa0a040000000017a914b0cdd2a8bb79a17db07b7ff593eb282a3360688b87eda9ee360000000017a914b8fa42bfe175cf5eacc6f61a720104437e8d1ddc8759e9fb310000000017a9141da46cbe94e616138225f090b0b2c2af2d63d96087a9e63a1e0000000017a914a70d96a25ddb647c95e7786083640ad4a619f17b870a3458350000000017a91411c9d4b370aa4f48c4249c59ffe37cc37d0fe3c387803070370000000017a914334b7940dae0b25417eadaaf1d27cc23d5f76a7f87e7985c360000000017a91454a0d53c1f6d7fc2bc4634577089ab1cec098bc887296572050000000017a91401d73a0cb01d412689b52b6e5d3c9d1f5b58a0798702483045022100e497292ca9dfd997a19db698c2f8b6f58ae0ed5354231edc733171394d4aa6b3022058ebea3ccfdd2ee1fa8ad792d2a4ce4e926495afa0768d7cb6051502ebf0ff78012102642087634a79dc9c90776132389cf1fe16cec90b23d55624a88c5b1ca5c796e40247304402202c00053b555e29f815f1845bd77077fd40cb68372b3f9e568fcafd12fd1a96a102205504e74f56a8dced807a0b6d5f3dea520108032c05df1dede3c04829aa4e78bf012103ceb2eaa9de62f1ff76747d7e2ff54a76c0ef0a7c626fa2309fa83d58b920146502473044022045a55c326cb40d4ee9278fc180bed8483632282405d9a6cd9ea26e82c4f9cf6f02201f9b339fd327f509adf93b9a8431c9ec7699dc51caf84c73668456ccebd56cff012102ff5bce27c41f9300797593e27712d0d5edd68a0f56b2efa29ec778342be23edb02483045022100c2ea04394bb89b7b31298837cb17cc21c87c49013c77833759446c8613c588300220124d3180a78c2536fa87c2a66be340f270a771fd10cf4dfccb24811311c9fe5f01210248b63f7050ef75a03921ed52c356230e12e05203b8e070ab14de7aa7b0ffe60502473044022048b58e0b27e3a6b98ba5ba801f43bde125f34d6f54ac1ab70adde2e101ccd62f02200ec87dd4549ef10f931b54c3de7bfb24d2cf744848a23d07617df0a8f37146130121027054326fdb00e2c2e559e9a3c64c83b5b42a5d693c4f69851d013ac9eff5aa1202483045022100c93964054831f57feeb143845b05335a2a5b350893fe75dd64c0e708461b125402202f308cfe170b4d9a443282919f52c9ea863033b3198c3b36c708cf114c6872c101210343ff2f65e9aef2eda1b8ea585c0c0edbfcdc7382cfa0ba04898dd798ec19b3e602483045022100d4b0e075a194ed186cb99c6ce8ca0bf0bf718a307190c2278291891b94e4e9fe02202cd91c05fa5e52c78f0ab14efb1901b502e66bc0841f1cb57abb558696f15b6c012102d1141734418483e3ab7c055ec1f3a5e559d764f6dc23fa055919abb1152c594b00000000

data/tx-C.dat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
010000000001011b17079deaba7b3245adb3ed0c00058134007a8d08ff4aec9d66a3fe703089060f00000000ffffffff1551f907000000000016001493073074d4c37a00251123e4a41ba7fa657d4651803801000000000017a914a5a674b7ec3b7c1144a73adcf9bb3f61c1c37f3887aeef0f000000000022002051413a8370db88bde6324ff184e2cead9faef9d9d7578c0622450e961b13016698e70300000000001976a91443c36f8f19647b811a44ea62d8d1b7107ec736f988ac9a8e08000000000017a914d74abad498d0037c8b04d0d82b97e07b1e1ad2e687d9960800000000001976a914baf05b358eb3c57859058cec0d4d4ae10445087c88ac61151d000000000016001421497d26b74412e222dae5f8abced1b86cc69dddf1ac0a000000000016001427fc96ed2d7b535c5a65b67316410827069a870af2ea0700000000001976a914cbdafbdefd318ad8107799391c82f774a8cad1c788ac89da0000000000001600144c8f308b016367b205915251f693b295ed9d74c59a4601000000000017a914dd0412636441d7fbb9f8b5ad2459d25e6a17dc33875ec20200000000001600146bc6a5c68b006b4f1f13b18efa818a21850d6f4d17ec07000000000017a914d596a9f403579414ed798899c6b2e4e94e4677ac8766fa0a000000000017a9140e4546d83e7bf95370e01dbfb6fa77d00f585de087d8910100000000001976a914390e2c70edfb09886ab2d7e04e0570392e88d6f788ac5aac0100000000001976a914fa85ea5ababc1780c08d1d8faed46b1df3b6953b88ac8f6301000000000017a91414b70b13a9ce04587eb2e664166b37277e5c0a26879fbf0c0000000000160014ae3c3e089e1ee1ff070f73020d83ef8574c8954acff54900000000002200204ce295b1e5f8b22712b488aef5b2c1eb33ea3f475f00cc2e27c5aeaeeab843574fdb0100000000001976a914c4a199ec51fef7072f916e1c47c1b879572f9fde88acca0ffed60200000016001408da93bfad48bddcdaf49e65248c3195a1838caa02473044022038f333a000e1319efcce8ad1b4214703047da1caa364b76c5b947c3c883194c9022055dd71f2f400de5f02b3f32330abdd1bae982d9b6e02b5b560893fb90e20fb980121022a51bd8200f44d72e94fa623ad6f79efb10fa6a873b5a8cf1c63b47f6301729b00000000

hie.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ cradle:
55

66
- path: "./test"
77
component: "bitcoin:test:spec"
8+
9+
- path: "./benchmark"
10+
component: "bitcoin:bench:benchmark"

0 commit comments

Comments
 (0)