Modify argument parser for multiple arguments.
Currently, if a test is created like this:
BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16");
Everything works as expected, a benchmark is created of BM_bench/16.
However, it is not possible to specify a benchmark should be called with
one argument, but iterate over different values. The example:
BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16 32");
Creates a single benchmark run with two arguments:
BM_bench/16/32
This change modifies the algorithm to make it possible to create multiple
instances of the benchmark iterating over each argument as a single
argument. After this change, two benchmarks are executed:
BM_bench/16
BM_bench/32
To do the previous behavior, use:
BIONIC_BENCHMARK_WITH_ARG(BM_bench, "16/32");
This will create a single benchmark with two args. This format does
not support spaces in the args, so "16 / 32" is not valid.
Modified the test_small.xml to use the new format.
Test: All unit tests pass.
Change-Id: I6f486e1d4a90580c3dace0581ea65f439911ef5a
diff --git a/benchmarks/bionic_benchmarks.cpp b/benchmarks/bionic_benchmarks.cpp
index 187ee76..74966c0 100644
--- a/benchmarks/bionic_benchmarks.cpp
+++ b/benchmarks/bionic_benchmarks.cpp
@@ -336,16 +336,36 @@
return to_populate;
}
- to_populate->push_back(std::vector<int64_t>());
- std::stringstream sstream(args);
- std::string argstr;
- while (sstream >> argstr) {
- char* check_null;
- int converted = static_cast<int>(strtol(argstr.c_str(), &check_null, 10));
- if (*check_null) {
- errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+ std::string trimmed_args = android::base::Trim(args);
+ if (!trimmed_args.empty()) {
+ std::stringstream sstream(trimmed_args);
+ std::string argstr;
+ while (sstream >> argstr) {
+ char* check_null;
+ int converted = static_cast<int>(strtol(argstr.c_str(), &check_null, 10));
+ if (*check_null == '\0') {
+ to_populate->emplace_back(std::vector<int64_t>{converted});
+ continue;
+ } else if (*check_null == '/') {
+ // The only supported format with a / is \d+(/\d+)\s*. Example 8/8/8 or 16/23.
+ std::vector<int64_t> test_args{converted};
+ while (true) {
+ converted = static_cast<int>(strtol(check_null + 1, &check_null, 10));
+ test_args.push_back(converted);
+ if (*check_null == '\0') {
+ to_populate->emplace_back(std::move(test_args));
+ break;
+ } else if (*check_null != '/') {
+ errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+ }
+ }
+ } else {
+ errx(1, "ERROR: Args str %s contains an invalid macro or int.", args.c_str());
+ }
}
- (*to_populate)[0].push_back(converted);
+ } else {
+ // No arguments, only the base benchmark.
+ to_populate->emplace_back(std::vector<int64_t>{});
}
return to_populate;
}