wire: Add large tx deserialize benchmark. (#678)

This adds a benchmark for deserializing a large transaction that is
often referred to as the megatransaction since it is the largest Bitcoin
transaction mined to date.  It consists of 5569 inputs and 1 output and
its hash is:

bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08.

This is being done so there is a benchmark that tests more of a
worst-case scenario which is a better candidate for identifying and
testing improvements.

The following benchmark results shows the how much more intensive this
transaction is over the existing mock transaction:

DeserializeTxSmall  1000000    1751 ns/op      376 B/op     16 allocs/op
DeserializeTxLarge  300     5093980 ns/op  1672829 B/op  33430 allocs/op
This commit is contained in:
Dave Collins 2016-04-25 16:51:27 -05:00
parent de4fb24389
commit 27c0f9f8d1
2 changed files with 24 additions and 2 deletions

View file

@ -6,7 +6,9 @@ package wire
import ( import (
"bytes" "bytes"
"compress/bzip2"
"io/ioutil" "io/ioutil"
"os"
"testing" "testing"
"time" "time"
) )
@ -306,8 +308,8 @@ func BenchmarkWriteTxIn(b *testing.B) {
} }
// BenchmarkDeserializeTx performs a benchmark on how long it takes to // BenchmarkDeserializeTx performs a benchmark on how long it takes to
// deserialize a transaction. // deserialize a small transaction.
func BenchmarkDeserializeTx(b *testing.B) { func BenchmarkDeserializeTxSmall(b *testing.B) {
buf := []byte{ buf := []byte{
0x01, 0x00, 0x00, 0x00, // Version 0x01, 0x00, 0x00, 0x00, // Version
0x01, // Varint for number of input transactions 0x01, // Varint for number of input transactions
@ -338,7 +340,27 @@ func BenchmarkDeserializeTx(b *testing.B) {
var tx MsgTx var tx MsgTx
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
tx.Deserialize(bytes.NewReader(buf)) tx.Deserialize(bytes.NewReader(buf))
}
}
// BenchmarkDeserializeTxLarge performs a benchmark on how long it takes to
// deserialize a very large transaction.
func BenchmarkDeserializeTxLarge(b *testing.B) {
// tx bb41a757f405890fb0f5856228e23b715702d714d59bf2b1feb70d8b2b4e3e08
// from the main block chain.
fi, err := os.Open("testdata/megatx.bin.bz2")
if err != nil {
b.Fatalf("Failed to read transaction data: %v", err)
}
defer fi.Close()
buf, err := ioutil.ReadAll(bzip2.NewReader(fi))
if err != nil {
b.Fatalf("Failed to read transaction data: %v", err)
}
var tx MsgTx
for i := 0; i < b.N; i++ {
tx.Deserialize(bytes.NewReader(buf))
} }
} }

BIN
wire/testdata/megatx.bin.bz2 vendored Normal file

Binary file not shown.