15
15
// This Benchmark tests the CheckQueue with the lightest
16
16
// weight Checks, so it should make any lock contention
17
17
// particularly visible
18
+ static const int MIN_CORES = 2 ;
19
+ static const size_t BATCHES = 101 ;
20
+ static const size_t BATCH_SIZE = 30 ;
21
+ static const int PREVECTOR_SIZE = 28 ;
22
+ static const int QUEUE_BATCH_SIZE = 128 ;
18
23
static void CCheckQueueSpeed (benchmark::State& state)
19
24
{
20
25
struct FakeJobNoWork {
@@ -24,21 +29,25 @@ static void CCheckQueueSpeed(benchmark::State& state)
24
29
}
25
30
void swap (FakeJobNoWork& x){};
26
31
};
27
- CCheckQueue<FakeJobNoWork> queue {128 };
32
+ CCheckQueue<FakeJobNoWork> queue {QUEUE_BATCH_SIZE };
28
33
boost::thread_group tg;
29
- for (auto x = 0 ; x < std::max (2 , GetNumCores ()); ++x) {
34
+ for (auto x = 0 ; x < std::max (MIN_CORES , GetNumCores ()); ++x) {
30
35
tg.create_thread ([&]{queue.Thread ();});
31
36
}
32
37
while (state.KeepRunning ()) {
33
38
CCheckQueueControl<FakeJobNoWork> control (&queue);
34
- // We can make vChecks out of the loop because calling Add doesn't
35
- // change the size of the vector.
36
- std::vector<FakeJobNoWork> vChecks;
37
- vChecks.resize (30 );
38
39
39
40
// We call Add a number of times to simulate the behavior of adding
40
41
// a block of transactions at once.
41
- for (size_t j = 0 ; j < 101 ; ++j) {
42
+
43
+ std::vector<std::vector<FakeJobNoWork>> vBatches (BATCHES);
44
+ for (auto & vChecks : vBatches) {
45
+ vChecks.resize (BATCH_SIZE);
46
+ }
47
+ for (auto & vChecks : vBatches) {
48
+ // We can't make vChecks in the inner loop because we want to measure
49
+ // the cost of getting the memory to each thread and we might get the same
50
+ // memory
42
51
control.Add (vChecks);
43
52
}
44
53
// control waits for completion by RAII, but
@@ -55,31 +64,31 @@ static void CCheckQueueSpeed(benchmark::State& state)
55
64
static void CCheckQueueSpeedPrevectorJob (benchmark::State& state)
56
65
{
57
66
struct PrevectorJob {
58
- prevector<28 , uint8_t > p;
67
+ prevector<PREVECTOR_SIZE , uint8_t > p;
59
68
PrevectorJob (){
60
69
}
61
70
PrevectorJob (FastRandomContext& insecure_rand){
62
- p.resize (insecure_rand.rand32 () % 56 );
71
+ p.resize (insecure_rand.rand32 () % (PREVECTOR_SIZE* 2 ) );
63
72
}
64
73
bool operator ()()
65
74
{
66
75
return true ;
67
76
}
68
77
void swap (PrevectorJob& x){p.swap (x.p );};
69
78
};
70
- CCheckQueue<PrevectorJob> queue {128 };
79
+ CCheckQueue<PrevectorJob> queue {QUEUE_BATCH_SIZE };
71
80
boost::thread_group tg;
72
- for (auto x = 0 ; x < std::max (2 , GetNumCores ()); ++x) {
81
+ for (auto x = 0 ; x < std::max (MIN_CORES , GetNumCores ()); ++x) {
73
82
tg.create_thread ([&]{queue.Thread ();});
74
83
}
75
84
while (state.KeepRunning ()) {
76
85
// Make insecure_rand here so that each iteration is identical.
77
86
FastRandomContext insecure_rand (true );
78
87
CCheckQueueControl<PrevectorJob> control (&queue);
79
- for ( size_t j = 0 ; j < 101 ; ++j) {
80
- std::vector<PrevectorJob> vChecks;
81
- vChecks.reserve (30 );
82
- for (auto x = 0 ; x < 30 ; ++x)
88
+ std::vector<std::vector<PrevectorJob>> vBatches (BATCHES);
89
+ for ( auto & vChecks : vBatches) {
90
+ vChecks.reserve (BATCH_SIZE );
91
+ for (size_t x = 0 ; x < BATCH_SIZE ; ++x)
83
92
vChecks.emplace_back (insecure_rand);
84
93
control.Add (vChecks);
85
94
}
0 commit comments