bench: add more mempool benchmarks
Add benchmarks for: - adding a transaction - calculating mempool ancestors/descendants
This commit is contained in:
1 parent
7976eb1ae7
commit
f107417490
1 file changed
+62
-4
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
class CCoinsViewCache;
|
class CCoinsViewCache;
|
||||||
|
|
||||||
static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
|
static void AddTx(const CTransactionRef& tx, CTxMemPool& pool, FastRandomContext& det_rand) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
|
||||||
{
|
{
|
||||||
int64_t nTime = 0;
|
int64_t nTime = 0;
|
||||||
unsigned int nHeight = 1;
|
unsigned int nHeight = 1;
|
||||||
@@ -29,7 +29,7 @@ static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_R
|
|||||||
bool spendsCoinbase = false;
|
bool spendsCoinbase = false;
|
||||||
unsigned int sigOpCost = 4;
|
unsigned int sigOpCost = 4;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), tx, 1000, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp));
|
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), tx, det_rand.randrange(10000)+1000, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Available {
|
struct Available {
|
||||||
@@ -93,6 +93,33 @@ static std::vector<CTransactionRef> CreateCoinCluster(FastRandomContext& det_ran
|
|||||||
return ordered_coins;
|
return ordered_coins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void MemPoolAddTransactions(benchmark::Bench& bench)
|
||||||
|
{
|
||||||
|
FastRandomContext det_rand{true};
|
||||||
|
int childTxs = 50;
|
||||||
|
if (bench.complexityN() > 1) {
|
||||||
|
childTxs = static_cast<int>(bench.complexityN());
|
||||||
|
}
|
||||||
|
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
|
||||||
|
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;
|
||||||
|
|
||||||
|
std::vector<CTransactionRef> transactions;
|
||||||
|
// Create 1000 clusters of 100 transactions each
|
||||||
|
for (int i=0; i<100; i++) {
|
||||||
|
auto new_txs = CreateCoinCluster(det_rand, childTxs, /*min_ancestors*/ 1);
|
||||||
|
transactions.insert(transactions.end(), new_txs.begin(), new_txs.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCK2(cs_main, pool.cs);
|
||||||
|
|
||||||
|
bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
|
||||||
|
for (auto& tx : transactions) {
|
||||||
|
AddTx(tx, pool, det_rand);
|
||||||
|
}
|
||||||
|
pool.TrimToSize(0, nullptr);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
static void ComplexMemPool(benchmark::Bench& bench)
|
static void ComplexMemPool(benchmark::Bench& bench)
|
||||||
{
|
{
|
||||||
FastRandomContext det_rand{true};
|
FastRandomContext det_rand{true};
|
||||||
@@ -121,7 +148,7 @@ static void ComplexMemPool(benchmark::Bench& bench)
|
|||||||
++tx_count;
|
++tx_count;
|
||||||
hashes_remove_for_block.emplace_back(tx->GetHash());
|
hashes_remove_for_block.emplace_back(tx->GetHash());
|
||||||
}
|
}
|
||||||
AddTx(tx, pool);
|
AddTx(tx, pool, det_rand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,12 +158,41 @@ static void ComplexMemPool(benchmark::Bench& bench)
|
|||||||
bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
|
bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
|
||||||
pool.removeForBlock(tx_remove_for_block, /*nBlockHeight*/100);
|
pool.removeForBlock(tx_remove_for_block, /*nBlockHeight*/100);
|
||||||
for (auto& tx: tx_remove_for_block) {
|
for (auto& tx: tx_remove_for_block) {
|
||||||
AddTx(tx, pool);
|
AddTx(tx, pool, det_rand);
|
||||||
}
|
}
|
||||||
pool.UpdateTransactionsFromBlock(hashes_remove_for_block);
|
pool.UpdateTransactionsFromBlock(hashes_remove_for_block);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void MemPoolAncestorsDescendants(benchmark::Bench& bench)
|
||||||
|
{
|
||||||
|
FastRandomContext det_rand{true};
|
||||||
|
int childTxs = 50;
|
||||||
|
if (bench.complexityN() > 1) {
|
||||||
|
childTxs = static_cast<int>(bench.complexityN());
|
||||||
|
}
|
||||||
|
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
|
||||||
|
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;
|
||||||
|
|
||||||
|
LOCK2(cs_main, pool.cs);
|
||||||
|
|
||||||
|
std::vector<CTransactionRef> transactions = CreateCoinCluster(det_rand, childTxs, /*min_ancestors=*/1);
|
||||||
|
for (auto& tx : transactions) {
|
||||||
|
AddTx(tx, pool, det_rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTxMemPool::txiter first_tx = *pool.GetIter(transactions[0]->GetHash());
|
||||||
|
CTxMemPool::txiter last_tx = *pool.GetIter(transactions.back()->GetHash());
|
||||||
|
|
||||||
|
bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
|
||||||
|
CTxMemPool::setEntries dummy;
|
||||||
|
ankerl::nanobench::doNotOptimizeAway(dummy);
|
||||||
|
pool.CalculateDescendants({first_tx}, dummy);
|
||||||
|
ankerl::nanobench::doNotOptimizeAway(pool.CalculateMemPoolAncestors(*last_tx));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void MempoolCheck(benchmark::Bench& bench)
|
static void MempoolCheck(benchmark::Bench& bench)
|
||||||
{
|
{
|
||||||
FastRandomContext det_rand{true};
|
FastRandomContext det_rand{true};
|
||||||
@@ -152,5 +208,7 @@ static void MempoolCheck(benchmark::Bench& bench)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BENCHMARK(MemPoolAncestorsDescendants, benchmark::PriorityLevel::HIGH);
|
||||||
|
BENCHMARK(MemPoolAddTransactions, benchmark::PriorityLevel::HIGH);
|
||||||
BENCHMARK(ComplexMemPool, benchmark::PriorityLevel::HIGH);
|
BENCHMARK(ComplexMemPool, benchmark::PriorityLevel::HIGH);
|
||||||
BENCHMARK(MempoolCheck, benchmark::PriorityLevel::HIGH);
|
BENCHMARK(MempoolCheck, benchmark::PriorityLevel::HIGH);
|
||||||
Reference in new issue
Block a user