mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
Add LoadExternalBlockFile() benchmark
This commit is contained in:
parent
fabc031048
commit
48a68908ba
2 changed files with 64 additions and 0 deletions
|
@ -32,6 +32,7 @@ bench_bench_bitcoin_SOURCES = \
|
|||
bench/examples.cpp \
|
||||
bench/gcs_filter.cpp \
|
||||
bench/hashpadding.cpp \
|
||||
bench/load_external.cpp \
|
||||
bench/lockedpool.cpp \
|
||||
bench/logging.cpp \
|
||||
bench/mempool_eviction.cpp \
|
||||
|
|
63
src/bench/load_external.cpp
Normal file
63
src/bench/load_external.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
// Copyright (c) 2022 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <bench/bench.h>
|
||||
#include <bench/data.h>
|
||||
#include <chainparams.h>
|
||||
#include <test/util/setup_common.h>
|
||||
#include <validation.h>
|
||||
|
||||
/**
|
||||
* The LoadExternalBlockFile() function is used during -reindex and -loadblock.
|
||||
*
|
||||
* Create a test file that's similar to a datadir/blocks/blk?????.dat file,
|
||||
* It contains around 134 copies of the same block (typical size of real block files).
|
||||
* For each block in the file, LoadExternalBlockFile() won't find its parent,
|
||||
* and so will skip the block. (In the real system, it will re-read the block
|
||||
* from disk later when it encounters its parent.)
|
||||
*
|
||||
* This benchmark measures the performance of deserializing the block (or just
|
||||
* its header, beginning with PR 16981).
|
||||
*/
|
||||
static void LoadExternalBlockFile(benchmark::Bench& bench)
|
||||
{
|
||||
const auto testing_setup{MakeNoLogFileContext<const TestingSetup>(CBaseChainParams::MAIN)};
|
||||
|
||||
// Create a single block as in the blocks files (magic bytes, block size,
|
||||
// block data) as a stream object.
|
||||
const fs::path blkfile{testing_setup.get()->m_path_root / "blk.dat"};
|
||||
CDataStream ss(SER_DISK, 0);
|
||||
auto params{testing_setup->m_node.chainman->GetParams()};
|
||||
ss << params.MessageStart();
|
||||
ss << static_cast<uint32_t>(benchmark::data::block413567.size());
|
||||
// We can't use the streaming serialization (ss << benchmark::data::block413567)
|
||||
// because that first writes a compact size.
|
||||
ss.write(MakeByteSpan(benchmark::data::block413567));
|
||||
|
||||
// Create the test file.
|
||||
{
|
||||
// "wb+" is "binary, O_RDWR | O_CREAT | O_TRUNC".
|
||||
FILE* file{fsbridge::fopen(blkfile, "wb+")};
|
||||
// Make the test block file about 128 MB in length.
|
||||
for (size_t i = 0; i < node::MAX_BLOCKFILE_SIZE / ss.size(); ++i) {
|
||||
if (fwrite(ss.data(), 1, ss.size(), file) != ss.size()) {
|
||||
throw std::runtime_error("write to test file failed\n");
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
Chainstate& chainstate{testing_setup->m_node.chainman->ActiveChainstate()};
|
||||
std::multimap<uint256, FlatFilePos> blocks_with_unknown_parent;
|
||||
FlatFilePos pos;
|
||||
bench.run([&] {
|
||||
// "rb" is "binary, O_RDONLY", positioned to the start of the file.
|
||||
// The file will be closed by LoadExternalBlockFile().
|
||||
FILE* file{fsbridge::fopen(blkfile, "rb")};
|
||||
chainstate.LoadExternalBlockFile(file, &pos, &blocks_with_unknown_parent);
|
||||
});
|
||||
fs::remove(blkfile);
|
||||
}
|
||||
|
||||
BENCHMARK(LoadExternalBlockFile, benchmark::PriorityLevel::HIGH);
|
Loading…
Add table
Reference in a new issue