Bitcoin ABC
0.22.13
P2P Digital Currency
src
bench
checkqueue.cpp
Go to the documentation of this file.
1
// Copyright (c) 2015 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 <boost/thread/thread.hpp>
14
15
#include <vector>
16
17
static
const
int
MIN_CORES
= 2;
18
static
const
size_t
BATCHES
= 101;
19
static
const
size_t
BATCH_SIZE
= 30;
20
static
const
int
PREVECTOR_SIZE
= 28;
21
static
const
size_t
QUEUE_BATCH_SIZE
= 128;
22
23
// This Benchmark tests the CheckQueue with a slightly realistic workload, where
24
// checks all contain a prevector that is indirect 50% of the time and there is
25
// a little bit of work done between calls to Add.
26
static
void
CCheckQueueSpeedPrevectorJob
(
benchmark::State
&state) {
27
const
ECCVerifyHandle
verify_handle;
28
ECC_Start
();
29
30
struct
PrevectorJob {
31
prevector<PREVECTOR_SIZE, uint8_t>
p;
32
PrevectorJob() {}
33
explicit
PrevectorJob(
FastRandomContext
&insecure_rand) {
34
p.
resize
(insecure_rand.
randrange
(
PREVECTOR_SIZE
* 2));
35
}
36
bool
operator()() {
return
true
; }
37
void
swap(PrevectorJob &x) { p.
swap
(x.p); };
38
};
39
CCheckQueue<PrevectorJob>
queue{
QUEUE_BATCH_SIZE
};
40
boost::thread_group tg;
41
for
(
auto
x = 0; x < std::max(
MIN_CORES
,
GetNumCores
()); ++x) {
42
tg.create_thread([&] { queue.Thread(); });
43
}
44
while
(state.
KeepRunning
()) {
45
// Make insecure_rand here so that each iteration is identical.
46
FastRandomContext
insecure_rand(
true
);
47
CCheckQueueControl<PrevectorJob>
control(&queue);
48
std::vector<std::vector<PrevectorJob>> vBatches(
BATCHES
);
49
for
(
auto
&vChecks : vBatches) {
50
vChecks.reserve(
BATCH_SIZE
);
51
for
(
size_t
x = 0; x <
BATCH_SIZE
; ++x) {
52
vChecks.emplace_back(insecure_rand);
53
}
54
control.
Add
(vChecks);
55
}
56
// control waits for completion by RAII, but it is done explicitly here
57
// for clarity
58
control.
Wait
();
59
}
60
tg.interrupt_all();
61
tg.join_all();
62
ECC_Stop
();
63
}
64
BENCHMARK
(
CCheckQueueSpeedPrevectorJob
, 1400);
MIN_CORES
static const int MIN_CORES
Definition:
checkqueue.cpp:17
PREVECTOR_SIZE
static const int PREVECTOR_SIZE
Definition:
checkqueue.cpp:20
ECC_Start
void ECC_Start()
Initialize the elliptic curve support.
Definition:
key.cpp:438
prevector::resize
void resize(size_type new_size)
Definition:
prevector.h:414
CCheckQueueControl::Add
void Add(std::vector< T > &vChecks)
Definition:
checkqueue.h:196
pubkey.h
GetNumCores
int GetNumCores()
Return the number of cores available on the current system.
Definition:
system.cpp:1338
prevector.h
BATCHES
static const size_t BATCHES
Definition:
checkqueue.cpp:18
benchmark::State::KeepRunning
bool KeepRunning()
Definition:
bench.h:71
CCheckQueueSpeedPrevectorJob
static void CCheckQueueSpeedPrevectorJob(benchmark::State &state)
Definition:
checkqueue.cpp:26
CCheckQueueControl
RAII-style controller object for a CCheckQueue that guarantees the passed queue is finished before co...
Definition:
checkqueue.h:16
CCheckQueueControl::Wait
bool Wait()
Definition:
checkqueue.h:187
ECCVerifyHandle
Users of this module must hold an ECCVerifyHandle.
Definition:
pubkey.h:223
prevector::swap
void swap(prevector< N, T, Size, Diff > &other)
Definition:
prevector.h:541
ECC_Stop
void ECC_Stop()
Deinitialize the elliptic curve support.
Definition:
key.cpp:455
FastRandomContext
Fast randomness source.
Definition:
random.h:113
CCheckQueue
Queue for verifications that have to be performed.
Definition:
checkqueue.h:28
BENCHMARK
BENCHMARK(CCheckQueueSpeedPrevectorJob, 1400)
prevector
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition:
prevector.h:38
QUEUE_BATCH_SIZE
static const size_t QUEUE_BATCH_SIZE
Definition:
checkqueue.cpp:21
bench.h
system.h
BATCH_SIZE
static const size_t BATCH_SIZE
Definition:
checkqueue.cpp:19
checkqueue.h
benchmark::State
Definition:
bench.h:55
random.h
key.h
FastRandomContext::randrange
uint64_t randrange(uint64_t range) noexcept
Generate a random integer in the range [0..range).
Definition:
random.h:188
Generated on Wed Jan 27 2021 17:36:22 for Bitcoin ABC by
1.8.13