Bitcoin Core
25.99.0
P2P Digital Currency
src
bench
checkqueue.cpp
Go to the documentation of this file.
1
// Copyright (c) 2015-2022 The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <
bench/bench.h
>
6
#include <
checkqueue.h
>
7
#include <
common/system.h
>
8
#include <
key.h
>
9
#include <
prevector.h
>
10
#include <
pubkey.h
>
11
#include <random.h>
12
13
#include <vector>
14
15
static
const
size_t
BATCHES
= 101;
16
static
const
size_t
BATCH_SIZE
= 30;
17
static
const
int
PREVECTOR_SIZE
= 28;
18
static
const
unsigned
int
QUEUE_BATCH_SIZE
= 128;
19
20
// This Benchmark tests the CheckQueue with a slightly realistic workload,
21
// where checks all contain a prevector that is indirect 50% of the time
22
// and there is a little bit of work done between calls to Add.
23
static
void
CCheckQueueSpeedPrevectorJob
(
benchmark::Bench
& bench)
24
{
25
// We shouldn't ever be running with the checkqueue on a single core machine.
26
if
(
GetNumCores
() <= 1)
return
;
27
28
ECC_Start
();
29
30
struct
PrevectorJob {
31
prevector<PREVECTOR_SIZE, uint8_t>
p;
32
explicit
PrevectorJob(
FastRandomContext
& insecure_rand){
33
p.
resize
(insecure_rand.
randrange
(
PREVECTOR_SIZE
*2));
34
}
35
bool
operator()()
36
{
37
return
true
;
38
}
39
};
40
CCheckQueue<PrevectorJob>
queue {
QUEUE_BATCH_SIZE
};
41
// The main thread should be counted to prevent thread oversubscription, and
42
// to decrease the variance of benchmark results.
43
queue.StartWorkerThreads(
GetNumCores
() - 1);
44
45
// create all the data once, then submit copies in the benchmark.
46
FastRandomContext
insecure_rand(
true
);
47
std::vector<std::vector<PrevectorJob>> vBatches(
BATCHES
);
48
for
(
auto
& vChecks : vBatches) {
49
vChecks.reserve(
BATCH_SIZE
);
50
for
(
size_t
x = 0; x <
BATCH_SIZE
; ++x)
51
vChecks.emplace_back(insecure_rand);
52
}
53
54
bench.
minEpochIterations
(10).
batch
(
BATCH_SIZE
*
BATCHES
).
unit
(
"job"
).
run
([&] {
55
// Make insecure_rand here so that each iteration is identical.
56
CCheckQueueControl<PrevectorJob>
control(&queue);
57
for
(
auto
vChecks : vBatches) {
58
control.
Add
(std::move(vChecks));
59
}
60
// control waits for completion by RAII, but
61
// it is done explicitly here for clarity
62
control.
Wait
();
63
});
64
queue.StopWorkerThreads();
65
ECC_Stop
();
66
}
67
BENCHMARK
(
CCheckQueueSpeedPrevectorJob
,
benchmark::PriorityLevel::HIGH
);
bench.h
BATCH_SIZE
static const size_t BATCH_SIZE
Definition:
checkqueue.cpp:16
CCheckQueueSpeedPrevectorJob
static void CCheckQueueSpeedPrevectorJob(benchmark::Bench &bench)
Definition:
checkqueue.cpp:23
PREVECTOR_SIZE
static const int PREVECTOR_SIZE
Definition:
checkqueue.cpp:17
BENCHMARK
BENCHMARK(CCheckQueueSpeedPrevectorJob, benchmark::PriorityLevel::HIGH)
BATCHES
static const size_t BATCHES
Definition:
checkqueue.cpp:15
QUEUE_BATCH_SIZE
static const unsigned int QUEUE_BATCH_SIZE
Definition:
checkqueue.cpp:18
ECC_Start
ECC_Start()
Definition:
key.cpp:429
ECC_Stop
ECC_Stop()
Definition:
key.cpp:446
checkqueue.h
CCheckQueueControl
RAII-style controller object for a CCheckQueue that guarantees the passed queue is finished before co...
Definition:
checkqueue.h:208
CCheckQueueControl::Wait
bool Wait()
Definition:
checkqueue.h:225
CCheckQueueControl::Add
void Add(std::vector< T > &&vChecks)
Definition:
checkqueue.h:234
CCheckQueue
Queue for verifications that have to be performed.
Definition:
checkqueue.h:31
FastRandomContext
Fast randomness source.
Definition:
random.h:144
FastRandomContext::randrange
uint64_t randrange(uint64_t range) noexcept
Generate a random integer in the range [0..range).
Definition:
random.h:202
ankerl::nanobench::Bench
Main entry point to nanobench's benchmarking facility.
Definition:
nanobench.h:623
ankerl::nanobench::Bench::run
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition:
nanobench.h:1230
ankerl::nanobench::Bench::batch
Bench & batch(T b) noexcept
Sets the batch size.
Definition:
nanobench.h:1254
ankerl::nanobench::Bench::unit
Bench & unit(char const *unit)
Sets the operation unit.
ankerl::nanobench::Bench::minEpochIterations
ANKERL_NANOBENCH(NODISCARD) std Bench & minEpochIterations(uint64_t numIters) noexcept
Sets the minimum number of iterations each epoch should take.
prevector
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition:
prevector.h:37
prevector::resize
void resize(size_type new_size)
Definition:
prevector.h:325
GetNumCores
int GetNumCores()
Return the number of cores available on the current system.
Definition:
system.cpp:98
key.h
benchmark::HIGH
@ HIGH
Definition:
bench.h:47
prevector.h
pubkey.h
system.h
Generated on Wed Oct 4 2023 02:44:41 for Bitcoin Core by
1.9.1