wire: Don't allocate new readers in benchmarks. (#679)

This modifies the benchmarks in the wire package to avoid creating a new
reader for each iteration.  This is useful since it means that showing
the memory allocations will only show the function under test instead of
the allocation for the benchmark setup as well.

The following is a before and after comparison of the allocations
with the benchmarks that did not change removed:

benchmark              old allocs     new allocs     delta
------------------------------------------------------------
ReadVarInt1            2              1              -50.00%
ReadVarInt3            2              1              -50.00%
ReadVarInt5            2              1              -50.00%
ReadVarInt9            2              1              -50.00%
ReadVarStr4            4              3              -25.00%
ReadVarStr10           4              3              -25.00%
ReadOutPoint           2              1              -50.00%
ReadTxOut              4              3              -25.00%
ReadTxIn               6              5              -16.67%
DeserializeTxSmall     16             15             -6.25%
DeserializeTxLarge     33430          33428          -0.01%
ReadBlockHeader        8              7              -12.50%
This commit is contained in:
Dave Collins 2016-04-25 16:57:44 -05:00
parent 27c0f9f8d1
commit e7ddaa468e

View File

@ -152,8 +152,10 @@ func BenchmarkWriteVarInt9(b *testing.B) {
// a single byte variable length integer. // a single byte variable length integer.
func BenchmarkReadVarInt1(b *testing.B) { func BenchmarkReadVarInt1(b *testing.B) {
buf := []byte{0x01} buf := []byte{0x01}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarInt(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarInt(r, 0)
} }
} }
@ -161,8 +163,10 @@ func BenchmarkReadVarInt1(b *testing.B) {
// a three byte variable length integer. // a three byte variable length integer.
func BenchmarkReadVarInt3(b *testing.B) { func BenchmarkReadVarInt3(b *testing.B) {
buf := []byte{0x0fd, 0xff, 0xff} buf := []byte{0x0fd, 0xff, 0xff}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarInt(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarInt(r, 0)
} }
} }
@ -170,8 +174,10 @@ func BenchmarkReadVarInt3(b *testing.B) {
// a five byte variable length integer. // a five byte variable length integer.
func BenchmarkReadVarInt5(b *testing.B) { func BenchmarkReadVarInt5(b *testing.B) {
buf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff} buf := []byte{0xfe, 0xff, 0xff, 0xff, 0xff}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarInt(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarInt(r, 0)
} }
} }
@ -179,8 +185,10 @@ func BenchmarkReadVarInt5(b *testing.B) {
// a nine byte variable length integer. // a nine byte variable length integer.
func BenchmarkReadVarInt9(b *testing.B) { func BenchmarkReadVarInt9(b *testing.B) {
buf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} buf := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarInt(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarInt(r, 0)
} }
} }
@ -188,8 +196,10 @@ func BenchmarkReadVarInt9(b *testing.B) {
// four byte variable length string. // four byte variable length string.
func BenchmarkReadVarStr4(b *testing.B) { func BenchmarkReadVarStr4(b *testing.B) {
buf := []byte{0x04, 't', 'e', 's', 't'} buf := []byte{0x04, 't', 'e', 's', 't'}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarString(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarString(r, 0)
} }
} }
@ -197,8 +207,10 @@ func BenchmarkReadVarStr4(b *testing.B) {
// ten byte variable length string. // ten byte variable length string.
func BenchmarkReadVarStr10(b *testing.B) { func BenchmarkReadVarStr10(b *testing.B) {
buf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'} buf := []byte{0x0a, 't', 'e', 's', 't', '0', '1', '2', '3', '4', '5'}
r := bytes.NewReader(buf)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
ReadVarString(bytes.NewReader(buf), 0) r.Seek(0, 0)
ReadVarString(r, 0)
} }
} }
@ -228,9 +240,11 @@ func BenchmarkReadOutPoint(b *testing.B) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Previous output hash
0xff, 0xff, 0xff, 0xff, // Previous output index 0xff, 0xff, 0xff, 0xff, // Previous output index
} }
r := bytes.NewReader(buf)
var op OutPoint var op OutPoint
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
readOutPoint(bytes.NewReader(buf), 0, 0, &op) r.Seek(0, 0)
readOutPoint(r, 0, 0, &op)
} }
} }
@ -264,9 +278,11 @@ func BenchmarkReadTxOut(b *testing.B) {
0xee, // 65-byte signature 0xee, // 65-byte signature
0xac, // OP_CHECKSIG 0xac, // OP_CHECKSIG
} }
r := bytes.NewReader(buf)
var txOut TxOut var txOut TxOut
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
readTxOut(bytes.NewReader(buf), 0, 0, &txOut) r.Seek(0, 0)
readTxOut(r, 0, 0, &txOut)
} }
} }
@ -292,9 +308,11 @@ func BenchmarkReadTxIn(b *testing.B) {
0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script 0x04, 0xff, 0xff, 0x00, 0x1d, 0x01, 0x04, // Signature script
0xff, 0xff, 0xff, 0xff, // Sequence 0xff, 0xff, 0xff, 0xff, // Sequence
} }
r := bytes.NewReader(buf)
var txIn TxIn var txIn TxIn
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
readTxIn(bytes.NewReader(buf), 0, 0, &txIn) r.Seek(0, 0)
readTxIn(r, 0, 0, &txIn)
} }
} }
@ -337,9 +355,12 @@ func BenchmarkDeserializeTxSmall(b *testing.B) {
0xac, // OP_CHECKSIG 0xac, // OP_CHECKSIG
0x00, 0x00, 0x00, 0x00, // Lock time 0x00, 0x00, 0x00, 0x00, // Lock time
} }
r := bytes.NewReader(buf)
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)) r.Seek(0, 0)
tx.Deserialize(r)
} }
} }
@ -358,9 +379,11 @@ func BenchmarkDeserializeTxLarge(b *testing.B) {
b.Fatalf("Failed to read transaction data: %v", err) b.Fatalf("Failed to read transaction data: %v", err)
} }
r := bytes.NewReader(buf)
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)) r.Seek(0, 0)
tx.Deserialize(r)
} }
} }
@ -392,9 +415,11 @@ func BenchmarkReadBlockHeader(b *testing.B) {
0xf3, 0xe0, 0x01, 0x00, // Nonce 0xf3, 0xe0, 0x01, 0x00, // Nonce
0x00, // TxnCount Varint 0x00, // TxnCount Varint
} }
r := bytes.NewReader(buf)
var header BlockHeader var header BlockHeader
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
readBlockHeader(bytes.NewReader(buf), 0, &header) r.Seek(0, 0)
readBlockHeader(r, 0, &header)
} }
} }