Bitcoin Core
22.99.0
P2P Digital Currency
src
bench
checkqueue.cpp
Go to the documentation of this file.
1
// Copyright (c) 2015-2020 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 <
key.h
>
8
#include <
prevector.h
>
9
#include <
pubkey.h
>
10
#include <
random.h
>
11
#include <
util/system.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
const
ECCVerifyHandle
verify_handle;
29
ECC_Start
();
30
31
struct
PrevectorJob {
32
prevector<PREVECTOR_SIZE, uint8_t>
p;
33
PrevectorJob(){
34
}
35
explicit
PrevectorJob(
FastRandomContext
& insecure_rand){
36
p.
resize
(insecure_rand.
randrange
(
PREVECTOR_SIZE
*2));
37
}
38
bool
operator()()
39
{
40
return
true
;
41
}
42
void
swap(PrevectorJob& x){p.
swap
(x.p);};
43
};
44
CCheckQueue<PrevectorJob>
queue {
QUEUE_BATCH_SIZE
};
45
// The main thread should be counted to prevent thread oversubscription, and
46
// to decrease the variance of benchmark results.
47
queue.StartWorkerThreads(
GetNumCores
() - 1);
48
49
// create all the data once, then submit copies in the benchmark.
50
FastRandomContext
insecure_rand(
true
);
51
std::vector<std::vector<PrevectorJob>> vBatches(
BATCHES
);
52
for
(
auto
& vChecks : vBatches) {
53
vChecks.reserve(
BATCH_SIZE
);
54
for
(
size_t
x = 0; x <
BATCH_SIZE
; ++x)
55
vChecks.emplace_back(insecure_rand);
56
}
57
58
bench.
minEpochIterations
(10).
batch
(
BATCH_SIZE
*
BATCHES
).
unit
(
"job"
).
run
([&] {
59
// Make insecure_rand here so that each iteration is identical.
60
CCheckQueueControl<PrevectorJob>
control(&queue);
61
for
(
auto
vChecks : vBatches) {
62
control.
Add
(vChecks);
63
}
64
// control waits for completion by RAII, but
65
// it is done explicitly here for clarity
66
control.
Wait
();
67
});
68
queue.StopWorkerThreads();
69
ECC_Stop
();
70
}
71
BENCHMARK
(
CCheckQueueSpeedPrevectorJob
);
ankerl::nanobench::Bench::batch
ANKERL_NANOBENCH(NODISCARD) std Bench & batch(T b) noexcept
Sets the batch size.
BATCH_SIZE
static const size_t BATCH_SIZE
Definition:
checkqueue.cpp:16
ankerl::nanobench::Bench
Main entry point to nanobench's benchmarking facility.
Definition:
nanobench.h:614
pubkey.h
BATCHES
static const size_t BATCHES
Definition:
checkqueue.cpp:15
CCheckQueueSpeedPrevectorJob
static void CCheckQueueSpeedPrevectorJob(benchmark::Bench &bench)
Definition:
checkqueue.cpp:23
CCheckQueueControl::Add
void Add(std::vector< T > &vChecks)
Definition:
checkqueue.h:231
ankerl::nanobench::Bench::minEpochIterations
ANKERL_NANOBENCH(NODISCARD) std Bench & minEpochIterations(uint64_t numIters) noexcept
Sets the minimum number of iterations each epoch should take.
random.h
checkqueue.h
ECC_Stop
void ECC_Stop()
Deinitialize the elliptic curve support.
Definition:
key.cpp:386
CCheckQueue
Queue for verifications that have to be performed.
Definition:
checkqueue.h:29
prevector::swap
void swap(prevector< N, T, Size, Diff > &other)
Definition:
prevector.h:461
ankerl::nanobench::Bench::run
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition:
nanobench.h:1181
ankerl::nanobench::Bench::unit
Bench & unit(char const *unit)
Sets the operation unit.
BENCHMARK
BENCHMARK(CCheckQueueSpeedPrevectorJob)
CCheckQueueControl
RAII-style controller object for a CCheckQueue that guarantees the passed queue is finished before co...
Definition:
checkqueue.h:16
GetNumCores
int GetNumCores()
Return the number of cores available on the current system.
Definition:
system.cpp:1339
bench.h
prevector::resize
void resize(size_type new_size)
Definition:
prevector.h:316
PREVECTOR_SIZE
static const int PREVECTOR_SIZE
Definition:
checkqueue.cpp:17
system.h
prevector
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition:
prevector.h:37
ECC_Start
void ECC_Start()
Initialize the elliptic curve support.
Definition:
key.cpp:369
key.h
CCheckQueueControl::Wait
bool Wait()
Definition:
checkqueue.h:222
ECCVerifyHandle
Users of this module must hold an ECCVerifyHandle.
Definition:
pubkey.h:310
FastRandomContext::randrange
uint64_t randrange(uint64_t range) noexcept
Generate a random integer in the range [0..range).
Definition:
random.h:190
prevector.h
QUEUE_BATCH_SIZE
static const unsigned int QUEUE_BATCH_SIZE
Definition:
checkqueue.cpp:18
FastRandomContext
Fast randomness source.
Definition:
random.h:119
Generated on Sun Aug 1 2021 20:04:05 for Bitcoin Core by
1.8.17