diff options
author | Dominic Hamon <dominic@google.com> | 2016-10-26 09:22:18 -0700 |
---|---|---|
committer | Dominic Hamon <dominic@google.com> | 2016-10-26 09:22:18 -0700 |
commit | 8e08aa75d9d25ae88ca2fbb8859238aec60b6ed4 (patch) | |
tree | a16fca1d9d9f10f26691340483a100bbefa218d6 | |
parent | 44c25c892a6229b20db7cd9dc05584ea865896de (diff) | |
parent | 3f23832a097db2da0d9823987dc574be3cefa1f3 (diff) | |
download | google-benchmark-8e08aa75d9d25ae88ca2fbb8859238aec60b6ed4.tar.gz |
Merge branch 'mkurdej-arg-names'
-rw-r--r-- | include/benchmark/benchmark_api.h | 11 | ||||
-rw-r--r-- | src/benchmark_register.cc | 30 | ||||
-rw-r--r-- | src/string_util.cc | 2 | ||||
-rw-r--r-- | test/reporter_output_test.cc | 41 |
4 files changed, 80 insertions, 4 deletions
diff --git a/include/benchmark/benchmark_api.h b/include/benchmark/benchmark_api.h index 39edcff..8292f14 100644 --- a/include/benchmark/benchmark_api.h +++ b/include/benchmark/benchmark_api.h @@ -510,6 +510,13 @@ class Benchmark { // REQUIRES: The function passed to the constructor must accept arg1, arg2 ... Benchmark* Ranges(const std::vector<std::pair<int, int> >& ranges); + // Equivalent to ArgNames({name}) + Benchmark* ArgName(const std::string& name); + + // Set the argument names to display in the benchmark name. If not called, + // only argument values will be shown. + Benchmark* ArgNames(const std::vector<std::string>& names); + // Equivalent to Ranges({{lo1, hi1}, {lo2, hi2}}). // NOTE: This is a legacy C++03 interface provided for compatibility only. // New code should use 'Ranges'. @@ -526,8 +533,7 @@ class Benchmark { Benchmark* Apply(void (*func)(Benchmark* benchmark)); // Set the range multiplier for non-dense range. If not called, the range - // multiplier - // kRangeMultiplier will be used. + // multiplier kRangeMultiplier will be used. Benchmark* RangeMultiplier(int multiplier); // Set the minimum amount of time to use when running this benchmark. This @@ -618,6 +624,7 @@ class Benchmark { std::string name_; ReportMode report_mode_; + std::vector<std::string> arg_names_; // Args for all benchmark runs std::vector<std::vector<int> > args_; // Args for all benchmark runs TimeUnit time_unit_; int range_multiplier_; diff --git a/src/benchmark_register.cc b/src/benchmark_register.cc index 2657d4a..4e580d8 100644 --- a/src/benchmark_register.cc +++ b/src/benchmark_register.cc @@ -151,8 +151,20 @@ bool BenchmarkFamilies::FindBenchmarks( instance.threads = num_threads; // Add arguments to instance name + size_t arg_i = 0; for (auto const& arg : args) { + instance.name += "/"; + + if (arg_i < family->arg_names_.size()) { + const auto& arg_name = family->arg_names_[arg_i]; + if (!arg_name.empty()) { + instance.name += + StringPrintF("%s:", family->arg_names_[arg_i].c_str()); + } + } + AppendHumanReadable(arg, &instance.name); + ++arg_i; } if (!IsZero(family->min_time_)) { @@ -293,6 +305,18 @@ Benchmark* Benchmark::Ranges(const std::vector<std::pair<int, int>>& ranges) { return this; } +Benchmark* Benchmark::ArgName(const std::string& name) { + CHECK(ArgsCnt() == -1 || ArgsCnt() == 1); + arg_names_ = {name}; + return this; +} + +Benchmark* Benchmark::ArgNames(const std::vector<std::string>& names) { + CHECK(ArgsCnt() == -1 || ArgsCnt() == static_cast<int>(names.size())); + arg_names_ = names; + return this; +} + Benchmark* Benchmark::DenseRange(int start, int limit, int step) { CHECK(ArgsCnt() == -1 || ArgsCnt() == 1); CHECK_GE(start, 0); @@ -398,7 +422,11 @@ Benchmark* Benchmark::ThreadPerCpu() { void Benchmark::SetName(const char* name) { name_ = name; } int Benchmark::ArgsCnt() const { - return args_.empty() ? -1 : static_cast<int>(args_.front().size()); + if (args_.empty()) { + if (arg_names_.empty()) return -1; + return static_cast<int>(arg_names_.size()); + } + return static_cast<int>(args_.front().size()); } //=============================================================================// diff --git a/src/string_util.cc b/src/string_util.cc index e073b81..4cefbfb 100644 --- a/src/string_util.cc +++ b/src/string_util.cc @@ -107,7 +107,7 @@ std::string ToBinaryStringFullySpecified(double value, double threshold, void AppendHumanReadable(int n, std::string* str) { std::stringstream ss; // Round down to the nearest SI prefix. - ss << "/" << ToBinaryStringFullySpecified(n, 1.0, 0); + ss << ToBinaryStringFullySpecified(n, 1.0, 0); *str += ss.str(); } diff --git a/test/reporter_output_test.cc b/test/reporter_output_test.cc index 59a0a39..cd6fa7c 100644 --- a/test/reporter_output_test.cc +++ b/test/reporter_output_test.cc @@ -52,6 +52,47 @@ ADD_CASES(TC_JSONOut, {{"\"name\": \"BM_error\",$"}, ADD_CASES(TC_CSVOut, {{"^\"BM_error\",,,,,,,,true,\"message\"$"}}); // ========================================================================= // +// ------------------------ Testing No Arg Name Output ----------------------- +// // +// ========================================================================= // + +void BM_no_arg_name(benchmark::State& state) { + while (state.KeepRunning()) { + } +} +BENCHMARK(BM_no_arg_name)->Arg(3); +ADD_CASES(TC_ConsoleOut, {{"^BM_no_arg_name/3 %console_report$"}}); +ADD_CASES(TC_JSONOut, {{"\"name\": \"BM_no_arg_name/3\",$"}}); +ADD_CASES(TC_CSVOut, {{"^\"BM_no_arg_name/3\",%csv_report$"}}); + +// ========================================================================= // +// ------------------------ Testing Arg Name Output ----------------------- // +// ========================================================================= // + +void BM_arg_name(benchmark::State& state) { + while (state.KeepRunning()) { + } +} +BENCHMARK(BM_arg_name)->ArgName("first")->Arg(3); +ADD_CASES(TC_ConsoleOut, {{"^BM_arg_name/first:3 %console_report$"}}); +ADD_CASES(TC_JSONOut, {{"\"name\": \"BM_arg_name/first:3\",$"}}); +ADD_CASES(TC_CSVOut, {{"^\"BM_arg_name/first:3\",%csv_report$"}}); + +// ========================================================================= // +// ------------------------ Testing Arg Names Output ----------------------- // +// ========================================================================= // + +void BM_arg_names(benchmark::State& state) { + while (state.KeepRunning()) { + } +} +BENCHMARK(BM_arg_names)->Args({2, 5, 4})->ArgNames({"first", "", "third"}); +ADD_CASES(TC_ConsoleOut, + {{"^BM_arg_names/first:2/5/third:4 %console_report$"}}); +ADD_CASES(TC_JSONOut, {{"\"name\": \"BM_arg_names/first:2/5/third:4\",$"}}); +ADD_CASES(TC_CSVOut, {{"^\"BM_arg_names/first:2/5/third:4\",%csv_report$"}}); + +// ========================================================================= // // ----------------------- Testing Complexity Output ----------------------- // // ========================================================================= // |