15 #include "benchmark/benchmark.h"
19 #ifndef BENCHMARK_OS_WINDOWS
20 #include <sys/resource.h>
27 #include <condition_variable>
52 static const int kRangeMultiplier = 8;
55 static const size_t kMaxFamilySize = 100;
66 class BenchmarkFamilies {
85 std::vector<std::unique_ptr<Benchmark>>
families_;
109 std::ostream* ErrStream) {
111 auto& Err = *ErrStream;
115 if (!re.Init(
spec, &error_msg)) {
116 Err <<
"Could not compile benchmark re: " << error_msg << std::endl;
121 const std::vector<int> one_thread = {1};
124 for (std::unique_ptr<Benchmark>& family :
families_) {
126 if (!family)
continue;
128 if (family->ArgsCnt() == -1) {
131 const std::vector<int>* thread_counts =
132 (family->thread_counts_.empty()
134 : &
static_cast<const std::vector<int>&
>(family->thread_counts_));
135 const size_t family_size = family->args_.size() * thread_counts->size();
138 if (family_size > kMaxFamilySize) {
139 Err <<
"The number of inputs is very large. " << family->name_
140 <<
" will be repeated at least " << family_size <<
" times.\n";
146 for (
auto const&
args : family->args_) {
151 instance.report_mode = family->report_mode_;
153 instance.time_unit = family->time_unit_;
154 instance.range_multiplier = family->range_multiplier_;
155 instance.min_time = family->min_time_;
156 instance.iterations = family->iterations_;
157 instance.repetitions = family->repetitions_;
158 instance.use_real_time = family->use_real_time_;
159 instance.use_manual_time = family->use_manual_time_;
160 instance.complexity = family->complexity_;
161 instance.complexity_lambda = family->complexity_lambda_;
169 if (arg_i < family->arg_names_.size()) {
170 const auto& arg_name = family->arg_names_[arg_i];
171 if (!arg_name.empty()) {
181 if (!
IsZero(family->min_time_))
183 if (family->iterations_ != 0)
185 if (family->repetitions_ != 0)
188 if (family->use_manual_time_) {
190 }
else if (family->use_real_time_) {
195 if (!family->thread_counts_.empty()) {
200 instance.last_benchmark_instance = (&
args == &family->args_.back());
210 std::unique_ptr<Benchmark> bench_ptr(bench);
232 range_multiplier_(kRangeMultiplier),
236 use_real_time_(
false),
237 use_manual_time_(
false),
239 complexity_lambda_(nullptr) {}
279 std::vector<int> arglist;
282 for (
int i : arglist) {
290 std::vector<std::vector<int>> arglists(ranges.size());
291 std::size_t
total = 1;
292 for (std::size_t i = 0;
i < ranges.size();
i++) {
295 total *= arglists[
i].size();
298 std::vector<std::size_t> ctr(arglists.size(), 0);
300 for (std::size_t i = 0;
i <
total;
i++) {
301 std::vector<int>
tmp;
302 tmp.reserve(arglists.size());
304 for (std::size_t j = 0;
j < arglists.size();
j++) {
305 tmp.push_back(arglists[j].at(ctr[j]));
310 for (std::size_t j = 0;
j < arglists.size();
j++) {
311 if (ctr[j] + 1 < arglists[j].
size()) {
350 custom_arguments(
this);
355 CHECK(multiplier > 1);
389 <<
"Cannot set UseRealTime and UseManualTime simultaneously.";
396 <<
"Cannot set UseRealTime and UseManualTime simultaneously.";
432 for (
auto i = min_threads;
i < max_threads;
i += stride) {
452 return static_cast<int>(
args_.front().size());