mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-08 13:49:35 +02:00
Merge bitcoin/bitcoin#30396: random: add benchmarks and drop unnecessary Shuffle function
6ecda04fefrandom: drop ad-hoc Shuffle in favor of std::shuffle (Pieter Wuille)da28a26aaebench random: benchmark more functions, and add InsecureRandomContext (Pieter Wuille)0a9bbc64c1random bench refactor: move to new bench/random.cpp (Pieter Wuille) Pull request description: This adds benchmarks for various operations on `FastRandomContext` and `InsecureRandomContext`, and then removes the ad-hoc `Shuffle` functions, now that it appears that standard library `std::shuffle` has comparable performance. The other reason for keeping `Shuffle`, namely the fact that libstdc++ used self-move (which debug mode panics on) has been fixed as well (see https://github.com/bitcoin/bitcoin/pull/29625#discussion_r1658344049). ACKs for top commit: achow101: ACK6ecda04fefhodlinator: ACK6ecda04fefdergoegge: Code review ACK6ecda04fefTree-SHA512: 2560b7312410581ff2b9bd0716e0f1558d910b5eadb9544785c972384985ac0f11f72d6b2797cfe2e7eb71fa57c30cffd98cc009cb4ee87a18b1524694211417
This commit is contained in:
@@ -26,6 +26,5 @@ FUZZ_TARGET(random)
|
||||
(void)fast_random_context();
|
||||
|
||||
std::vector<int64_t> integrals = ConsumeRandomLengthIntegralVector<int64_t>(fuzzed_data_provider);
|
||||
Shuffle(integrals.begin(), integrals.end(), fast_random_context);
|
||||
std::shuffle(integrals.begin(), integrals.end(), fast_random_context);
|
||||
}
|
||||
|
||||
@@ -346,7 +346,7 @@ void TestSatisfy(const KeyConverter& converter, const std::string& testcase, con
|
||||
auto challenges = FindChallenges(node); // Find all challenges in the generated miniscript.
|
||||
std::vector<Challenge> challist(challenges.begin(), challenges.end());
|
||||
for (int iter = 0; iter < 3; ++iter) {
|
||||
Shuffle(challist.begin(), challist.end(), g_insecure_rand_ctx);
|
||||
std::shuffle(challist.begin(), challist.end(), g_insecure_rand_ctx);
|
||||
Satisfier satisfier(converter.MsContext());
|
||||
TestSignatureChecker checker(satisfier);
|
||||
bool prev_mal_success = false, prev_nonmal_success = false;
|
||||
|
||||
@@ -31,7 +31,7 @@ bool IsProtected(int num_peers,
|
||||
for (NodeEvictionCandidate& candidate : candidates) {
|
||||
candidate_setup_fn(candidate);
|
||||
}
|
||||
Shuffle(candidates.begin(), candidates.end(), random_context);
|
||||
std::shuffle(candidates.begin(), candidates.end(), random_context);
|
||||
|
||||
const size_t size{candidates.size()};
|
||||
const size_t expected{size - size / 2}; // Expect half the candidates will be protected.
|
||||
@@ -572,7 +572,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
|
||||
// Returns true if any of the node ids in node_ids are selected for eviction.
|
||||
bool IsEvicted(std::vector<NodeEvictionCandidate> candidates, const std::unordered_set<NodeId>& node_ids, FastRandomContext& random_context)
|
||||
{
|
||||
Shuffle(candidates.begin(), candidates.end(), random_context);
|
||||
std::shuffle(candidates.begin(), candidates.end(), random_context);
|
||||
const std::optional<NodeId> evicted_node_id = SelectNodeToEvict(std::move(candidates));
|
||||
if (!evicted_node_id) {
|
||||
return false;
|
||||
|
||||
@@ -206,10 +206,6 @@ BOOST_AUTO_TEST_CASE(stdrandom_test)
|
||||
for (int j = 1; j <= 10; ++j) {
|
||||
BOOST_CHECK(std::find(test.begin(), test.end(), j) != test.end());
|
||||
}
|
||||
Shuffle(test.begin(), test.end(), ctx);
|
||||
for (int j = 1; j <= 10; ++j) {
|
||||
BOOST_CHECK(std::find(test.begin(), test.end(), j) != test.end());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +216,7 @@ BOOST_AUTO_TEST_CASE(shuffle_stat_test)
|
||||
uint32_t counts[5 * 5 * 5 * 5 * 5] = {0};
|
||||
for (int i = 0; i < 12000; ++i) {
|
||||
int data[5] = {0, 1, 2, 3, 4};
|
||||
Shuffle(std::begin(data), std::end(data), ctx);
|
||||
std::shuffle(std::begin(data), std::end(data), ctx);
|
||||
int pos = data[0] + data[1] * 5 + data[2] * 25 + data[3] * 125 + data[4] * 625;
|
||||
++counts[pos];
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@ BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
|
||||
|
||||
// The parents can be in any order.
|
||||
FastRandomContext rng;
|
||||
Shuffle(package.begin(), package.end(), rng);
|
||||
std::shuffle(package.begin(), package.end(), rng);
|
||||
package.push_back(MakeTransactionRef(child));
|
||||
|
||||
PackageValidationState state;
|
||||
|
||||
@@ -392,7 +392,7 @@ void BuildBigPriorityTest(Scenario& scenario, int peers)
|
||||
|
||||
// Determine the announcement order randomly.
|
||||
std::vector<NodeId> announce_order = request_order;
|
||||
Shuffle(announce_order.begin(), announce_order.end(), g_insecure_rand_ctx);
|
||||
std::shuffle(announce_order.begin(), announce_order.end(), g_insecure_rand_ctx);
|
||||
|
||||
// Find a gtxid whose txhash prioritization is consistent with the required ordering within pref_peers and
|
||||
// within npref_peers.
|
||||
@@ -697,7 +697,7 @@ void TestInterleavedScenarios()
|
||||
builders.emplace_back([](Scenario& scenario){ BuildWeirdRequestsTest(scenario); });
|
||||
}
|
||||
// Randomly shuffle all those functions.
|
||||
Shuffle(builders.begin(), builders.end(), g_insecure_rand_ctx);
|
||||
std::shuffle(builders.begin(), builders.end(), g_insecure_rand_ctx);
|
||||
|
||||
Runner runner;
|
||||
auto starttime = RandomTime1y();
|
||||
|
||||
Reference in New Issue
Block a user