mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-04 10:07:27 -05:00
5602cc7ccf
db929893ef
Faster -reindex by initially deserializing only headers (Larry Ruane)c72de9990a
util: add CBufferedFile::SkipTo() to move ahead in the stream (Larry Ruane)48a68908ba
Add LoadExternalBlockFile() benchmark (Larry Ruane) Pull request description: ### Background During the first part of reindexing, `LoadExternalBlockFile()` sequentially reads raw blocks from the `blocks/blk00nnn.dat` files (rather than receiving them from peers, as with initial block download) and eventually adds all of them to the block index. When an individual block is initially read, it can't be immediately added unless all its ancestors have been added, which is rare (only about 8% of the time), because the blocks are not sorted by height. When the block can't be immediately added to the block index, its disk location is saved in a map so it can be added later. When its parent is later added to the block index, `LoadExternalBlockFile()` reads and deserializes the block from disk a second time and adds it to the block index. Most blocks (92%) get deserialized twice. ### This PR During the initial read, it's rarely useful to deserialize the entire block; only the header is needed to determine if the block can be added to the block index immediately. This change to `LoadExternalBlockFile()` initially deserializes only a block's header, then deserializes the entire block only if it can be added immediately. This reduces reindex time on mainnet by 7 hours on a Raspberry Pi, which translates to around a 25% reduction in the first part of reindexing (adding blocks to the index), and about a 6% reduction in overall reindex time. Summary: The performance gain is the result of deserializing each block only once, except its header which is deserialized twice, but the header is only 80 bytes. ACKs for top commit: andrewtoth: ACKdb929893ef
achow101: ACKdb929893ef
aureleoules: ACKdb929893ef
- minor changes and new benchmark since last review theStack: re-ACKdb929893ef
stickies-v: re-ACKdb929893e
Tree-SHA512: 5a5377192c11edb5b662e18f511c9beb8f250bc88aeadf2f404c92c3232a7617bade50477ebf16c0602b9bd3b68306d3ee7615de58acfd8cae664d28bb7b0136
99 lines
2.8 KiB
Text
99 lines
2.8 KiB
Text
# Copyright (c) 2015-2016 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
bin_PROGRAMS += bench/bench_bitcoin
|
|
BENCH_SRCDIR = bench
|
|
BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)
|
|
|
|
RAW_BENCH_FILES = \
|
|
bench/data/block413567.raw
|
|
GENERATED_BENCH_FILES = $(RAW_BENCH_FILES:.raw=.raw.h)
|
|
|
|
bench_bench_bitcoin_SOURCES = \
|
|
$(RAW_BENCH_FILES) \
|
|
bench/addrman.cpp \
|
|
bench/base58.cpp \
|
|
bench/bech32.cpp \
|
|
bench/bench.cpp \
|
|
bench/bench.h \
|
|
bench/bench_bitcoin.cpp \
|
|
bench/block_assemble.cpp \
|
|
bench/ccoins_caching.cpp \
|
|
bench/chacha20.cpp \
|
|
bench/chacha_poly_aead.cpp \
|
|
bench/checkblock.cpp \
|
|
bench/checkqueue.cpp \
|
|
bench/crypto_hash.cpp \
|
|
bench/data.cpp \
|
|
bench/data.h \
|
|
bench/descriptors.cpp \
|
|
bench/duplicate_inputs.cpp \
|
|
bench/examples.cpp \
|
|
bench/gcs_filter.cpp \
|
|
bench/hashpadding.cpp \
|
|
bench/load_external.cpp \
|
|
bench/lockedpool.cpp \
|
|
bench/logging.cpp \
|
|
bench/mempool_eviction.cpp \
|
|
bench/mempool_stress.cpp \
|
|
bench/merkle_root.cpp \
|
|
bench/nanobench.cpp \
|
|
bench/nanobench.h \
|
|
bench/peer_eviction.cpp \
|
|
bench/poly1305.cpp \
|
|
bench/prevector.cpp \
|
|
bench/rollingbloom.cpp \
|
|
bench/rpc_blockchain.cpp \
|
|
bench/rpc_mempool.cpp \
|
|
bench/strencodings.cpp \
|
|
bench/util_time.cpp \
|
|
bench/verify_script.cpp
|
|
|
|
nodist_bench_bench_bitcoin_SOURCES = $(GENERATED_BENCH_FILES)
|
|
|
|
bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/
|
|
bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
|
bench_bench_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
|
|
bench_bench_bitcoin_LDADD = \
|
|
$(LIBTEST_UTIL) \
|
|
$(LIBBITCOIN_NODE) \
|
|
$(LIBBITCOIN_WALLET) \
|
|
$(LIBBITCOIN_COMMON) \
|
|
$(LIBBITCOIN_UTIL) \
|
|
$(LIBBITCOIN_CONSENSUS) \
|
|
$(LIBBITCOIN_CRYPTO) \
|
|
$(LIBLEVELDB) \
|
|
$(LIBMEMENV) \
|
|
$(LIBSECP256K1) \
|
|
$(LIBUNIVALUE) \
|
|
$(EVENT_PTHREADS_LIBS) \
|
|
$(EVENT_LIBS) \
|
|
$(MINIUPNPC_LIBS) \
|
|
$(NATPMP_LIBS)
|
|
|
|
if ENABLE_ZMQ
|
|
bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
|
endif
|
|
|
|
if ENABLE_WALLET
|
|
bench_bench_bitcoin_SOURCES += bench/coin_selection.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_balance.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_loading.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_create_tx.cpp
|
|
bench_bench_bitcoin_LDADD += $(BDB_LIBS) $(SQLITE_LIBS)
|
|
endif
|
|
|
|
CLEAN_BITCOIN_BENCH = bench/*.gcda bench/*.gcno $(GENERATED_BENCH_FILES)
|
|
|
|
CLEANFILES += $(CLEAN_BITCOIN_BENCH)
|
|
|
|
bench/data.cpp: bench/data/block413567.raw.h
|
|
|
|
bitcoin_bench: $(BENCH_BINARY)
|
|
|
|
bench: $(BENCH_BINARY) FORCE
|
|
$(BENCH_BINARY)
|
|
|
|
bitcoin_bench_clean : FORCE
|
|
rm -f $(CLEAN_BITCOIN_BENCH) $(bench_bench_bitcoin_OBJECTS) $(BENCH_BINARY)
|