Skip to content

Commit ccfba5f

Browse files
authored
Merge d4e15a7 into f090141
2 parents f090141 + d4e15a7 commit ccfba5f

File tree

5 files changed

+47
-27
lines changed

5 files changed

+47
-27
lines changed

include/benchmark/benchmark.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ struct Statistics {
430430
};
431431

432432
namespace internal {
433+
struct BenchmarkInstance;
433434
class ThreadTimer;
434435
class ThreadManager;
435436

@@ -660,12 +661,11 @@ class State {
660661
// Number of threads concurrently executing the benchmark.
661662
const int threads;
662663

663-
// TODO(EricWF) make me private
664+
private:
664665
State(size_t max_iters, const std::vector<int64_t>& ranges, int thread_i,
665666
int n_threads, internal::ThreadTimer* timer,
666667
internal::ThreadManager* manager);
667668

668-
private:
669669
void StartKeepRunning();
670670
// Implementation of KeepRunning() and KeepRunningBatch().
671671
// is_batch must be true unless n is 1.
@@ -674,6 +674,8 @@ class State {
674674
internal::ThreadTimer* timer_;
675675
internal::ThreadManager* manager_;
676676
BENCHMARK_DISALLOW_COPY_AND_ASSIGN(State);
677+
678+
friend struct internal::BenchmarkInstance;
677679
};
678680

679681
inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunning() {
@@ -923,9 +925,6 @@ class Benchmark {
923925

924926
virtual void Run(State& state) = 0;
925927

926-
// Used inside the benchmark implementation
927-
struct Instance;
928-
929928
protected:
930929
explicit Benchmark(const char* name);
931930
Benchmark(Benchmark const&);

src/benchmark.cc

+14-16
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void UseCharPointer(char const volatile*) {}
116116
namespace {
117117

118118
BenchmarkReporter::Run CreateRunReport(
119-
const benchmark::internal::Benchmark::Instance& b,
119+
const benchmark::internal::BenchmarkInstance& b,
120120
const internal::ThreadManager::Result& results, size_t memory_iterations,
121121
const MemoryManager::Result& memory_result, double seconds) {
122122
// Create report about this benchmark run.
@@ -170,31 +170,29 @@ BenchmarkReporter::Run CreateRunReport(
170170

171171
// Execute one thread of benchmark b for the specified number of iterations.
172172
// Adds the stats collected for the thread into *total.
173-
void RunInThread(const benchmark::internal::Benchmark::Instance* b,
174-
size_t iters, int thread_id,
175-
internal::ThreadManager* manager) {
173+
void RunInThread(const internal::BenchmarkInstance* b, size_t iters,
174+
int thread_id, internal::ThreadManager* manager) {
176175
internal::ThreadTimer timer;
177-
State st(iters, b->arg, thread_id, b->threads, &timer, manager);
178-
b->benchmark->Run(st);
179-
CHECK(st.iterations() >= st.max_iterations)
176+
std::unique_ptr<State> st = b->Run(iters, thread_id, &timer, manager);
177+
CHECK(st->iterations() >= st->max_iterations)
180178
<< "Benchmark returned before State::KeepRunning() returned false!";
181179
{
182180
MutexLock l(manager->GetBenchmarkMutex());
183181
internal::ThreadManager::Result& results = manager->results;
184-
results.iterations += st.iterations();
182+
results.iterations += st->iterations();
185183
results.cpu_time_used += timer.cpu_time_used();
186184
results.real_time_used += timer.real_time_used();
187185
results.manual_time_used += timer.manual_time_used();
188-
results.bytes_processed += st.bytes_processed();
189-
results.items_processed += st.items_processed();
190-
results.complexity_n += st.complexity_length_n();
191-
internal::Increment(&results.counters, st.counters);
186+
results.bytes_processed += st->bytes_processed();
187+
results.items_processed += st->items_processed();
188+
results.complexity_n += st->complexity_length_n();
189+
internal::Increment(&results.counters, st->counters);
192190
}
193191
manager->NotifyThreadComplete();
194192
}
195193

196194
std::vector<BenchmarkReporter::Run> RunBenchmark(
197-
const benchmark::internal::Benchmark::Instance& b,
195+
const benchmark::internal::BenchmarkInstance& b,
198196
std::vector<BenchmarkReporter::Run>* complexity_reports) {
199197
std::vector<BenchmarkReporter::Run> reports; // return value
200198

@@ -423,7 +421,7 @@ void State::FinishKeepRunning() {
423421
namespace internal {
424422
namespace {
425423

426-
void RunBenchmarks(const std::vector<Benchmark::Instance>& benchmarks,
424+
void RunBenchmarks(const std::vector<BenchmarkInstance>& benchmarks,
427425
BenchmarkReporter* display_reporter,
428426
BenchmarkReporter* file_reporter) {
429427
// Note the file_reporter can be null.
@@ -433,7 +431,7 @@ void RunBenchmarks(const std::vector<Benchmark::Instance>& benchmarks,
433431
bool has_repetitions = FLAGS_benchmark_repetitions > 1;
434432
size_t name_field_width = 10;
435433
size_t stat_field_width = 0;
436-
for (const Benchmark::Instance& benchmark : benchmarks) {
434+
for (const BenchmarkInstance& benchmark : benchmarks) {
437435
name_field_width =
438436
std::max<size_t>(name_field_width, benchmark.name.size());
439437
has_repetitions |= benchmark.repetitions > 1;
@@ -567,7 +565,7 @@ size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
567565
file_reporter->SetErrorStream(&output_file);
568566
}
569567

570-
std::vector<internal::Benchmark::Instance> benchmarks;
568+
std::vector<internal::BenchmarkInstance> benchmarks;
571569
if (!FindBenchmarksInternal(spec, &benchmarks, &Err)) return 0;
572570

573571
if (benchmarks.empty()) {

src/benchmark_api_internal.cc

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "benchmark_api_internal.h"
2+
3+
#include <memory>
4+
5+
namespace benchmark {
6+
namespace internal {
7+
8+
std::unique_ptr<State> BenchmarkInstance::Run(
9+
size_t iters, int thread_id, internal::ThreadTimer* timer,
10+
internal::ThreadManager* manager) const {
11+
auto st = std::unique_ptr<State>(new State(iters, arg, thread_id, threads,
12+
timer, manager));
13+
benchmark->Run(*st);
14+
return st;
15+
}
16+
17+
} // internal
18+
} // benchmark

src/benchmark_api_internal.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
#include <cmath>
77
#include <iosfwd>
88
#include <limits>
9+
#include <memory>
910
#include <string>
1011
#include <vector>
1112

1213
namespace benchmark {
1314
namespace internal {
1415

1516
// Information kept per benchmark we may want to run
16-
struct Benchmark::Instance {
17+
struct BenchmarkInstance {
1718
std::string name;
1819
Benchmark* benchmark;
1920
AggregationReportMode aggregation_report_mode;
@@ -31,10 +32,14 @@ struct Benchmark::Instance {
3132
double min_time;
3233
size_t iterations;
3334
int threads; // Number of concurrent threads to us
35+
36+
std::unique_ptr<State> Run(size_t iters, int thread_id,
37+
internal::ThreadTimer* timer,
38+
internal::ThreadManager* manager) const;
3439
};
3540

3641
bool FindBenchmarksInternal(const std::string& re,
37-
std::vector<Benchmark::Instance>* benchmarks,
42+
std::vector<BenchmarkInstance>* benchmarks,
3843
std::ostream* Err);
3944

4045
bool IsZero(double n);

src/benchmark_register.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class BenchmarkFamilies {
7878
// Extract the list of benchmark instances that match the specified
7979
// regular expression.
8080
bool FindBenchmarks(std::string re,
81-
std::vector<Benchmark::Instance>* benchmarks,
81+
std::vector<BenchmarkInstance>* benchmarks,
8282
std::ostream* Err);
8383

8484
private:
@@ -107,7 +107,7 @@ void BenchmarkFamilies::ClearBenchmarks() {
107107
}
108108

109109
bool BenchmarkFamilies::FindBenchmarks(
110-
std::string spec, std::vector<Benchmark::Instance>* benchmarks,
110+
std::string spec, std::vector<BenchmarkInstance>* benchmarks,
111111
std::ostream* ErrStream) {
112112
CHECK(ErrStream);
113113
auto& Err = *ErrStream;
@@ -152,7 +152,7 @@ bool BenchmarkFamilies::FindBenchmarks(
152152

153153
for (auto const& args : family->args_) {
154154
for (int num_threads : *thread_counts) {
155-
Benchmark::Instance instance;
155+
BenchmarkInstance instance;
156156
instance.name = family->name_;
157157
instance.benchmark = family.get();
158158
instance.aggregation_report_mode = family->aggregation_report_mode_;
@@ -225,7 +225,7 @@ Benchmark* RegisterBenchmarkInternal(Benchmark* bench) {
225225
// FIXME: This function is a hack so that benchmark.cc can access
226226
// `BenchmarkFamilies`
227227
bool FindBenchmarksInternal(const std::string& re,
228-
std::vector<Benchmark::Instance>* benchmarks,
228+
std::vector<BenchmarkInstance>* benchmarks,
229229
std::ostream* Err) {
230230
return BenchmarkFamilies::GetInstance()->FindBenchmarks(re, benchmarks, Err);
231231
}

0 commit comments

Comments
 (0)