Merge bitcoin/bitcoin#30474: fuzz: Speed up PickValue in txorphan

fa33a63bd9 fuzz: Speed up PickValue in txorphan (MarcoFalke)

Pull request description:

  `PickValue` will advance a begin iterator on the `outpoints` set, which is expensive, because it only has a `++` operator. As it is called in a loop of `num_in` (~`outpoints.size()`), the runtime is `O(outpoints.size() ^ 2)`.

  Fix it by making the runtime linear.

ACKs for top commit:
  glozow:
    ACK fa33a63bd9, thanks for taking the suggestion
  dergoegge:
    utACK fa33a63bd9

Tree-SHA512: 33f440d97c6834d907d43a8d29e4fb2c995f0d244460bd079af100f13d3607a53e44a0db52f4eb5c487d98df0ff4f2f6d987bf94b922ae9f4506f1295ad6214c
This commit is contained in:
merge-script 2024-07-23 10:49:36 +01:00
commit 910d38b22f
No known key found for this signature in database
GPG Key ID: 2EEB9F5CC09526C1

View File

@ -1,4 +1,4 @@
// Copyright (c) 2022 The Bitcoin Core developers
// Copyright (c) 2022-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -37,11 +37,11 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
SetMockTime(ConsumeTime(fuzzed_data_provider));
TxOrphanage orphanage;
std::set<COutPoint> outpoints;
std::vector<COutPoint> outpoints; // Duplicates are tolerated
// initial outpoints used to construct transactions later
for (uint8_t i = 0; i < 4; i++) {
outpoints.emplace(Txid::FromUint256(uint256{i}), 0);
outpoints.emplace_back(Txid::FromUint256(uint256{i}), 0);
}
CTransactionRef ptx_potential_parent = nullptr;
@ -67,7 +67,7 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
auto new_tx = MakeTransactionRef(tx_mut);
// add newly constructed outpoints to the coin pool
for (uint32_t i = 0; i < num_out; i++) {
outpoints.emplace(new_tx->GetHash(), i);
outpoints.emplace_back(new_tx->GetHash(), i);
}
return new_tx;
}();