diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index abb81195e38e2..ed1c71e20216b 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -673,7 +673,8 @@ type storedReceiptRLP struct { } // ReceiptLogs is a barebone version of ReceiptForStorage which only keeps -// the list of logs. +// the list of logs. When decoding a stored receipt into this object we +// avoid creating the bloom filter. type receiptLogs struct { Logs []*types.Log } diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index 0b328e18675c3..4b173c55eeb04 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -857,3 +857,29 @@ func TestDeriveLogFields(t *testing.T) { } } } + +func BenchmarkDecodeRLPLogs(b *testing.B) { + // Encoded receipts from block 0x14ee094309fbe8f70b65f45ebcc08fb33f126942d97464aad5eb91cfd1e2d269 + buf, err := ioutil.ReadFile("testdata/stored_receipts.bin") + if err != nil { + b.Fatal(err) + } + b.Run("ReceiptForStorage", func(b *testing.B) { + b.ReportAllocs() + var r []*types.ReceiptForStorage + for i := 0; i < b.N; i++ { + if err := rlp.DecodeBytes(buf, &r); err != nil { + b.Fatal(err) + } + } + }) + b.Run("rlpLogs", func(b *testing.B) { + b.ReportAllocs() + var r []*receiptLogs + for i := 0; i < b.N; i++ { + if err := rlp.DecodeBytes(buf, &r); err != nil { + b.Fatal(err) + } + } + }) +} diff --git a/core/rawdb/testdata/stored_receipts.bin b/core/rawdb/testdata/stored_receipts.bin new file mode 100644 index 0000000000000..8204fae09bdef Binary files /dev/null and b/core/rawdb/testdata/stored_receipts.bin differ