31 void GenerateTemplateResults(
const std::vector<ankerl::nanobench::Result>& benchmarkResults,
const fs::path& file,
const char* tpl)
33 if (benchmarkResults.empty() || file.empty()) {
37 std::ofstream fout{file};
40 std::cout <<
"Created " << file << std::endl;
42 std::cout <<
"Could not write to file " << file << std::endl;
59 using item_t = std::pair<std::string, uint8_t>;
60 auto sort_by_priority = [](item_t a, item_t b){
return a.second < b.second; };
62 return Join(sorted_priorities,
',', [](
const auto& entry){
return entry.first; });
75 return benchmarks_map;
80 benchmarks().insert(std::make_pair(
name, std::make_pair(func, level)));
85 std::regex reFilter(
args.regex_filter);
86 std::smatch baseMatch;
88 if (
args.sanity_check) {
89 std::cout <<
"Running with -sanity-check option, output is being suppressed as benchmark results will be useless." << std::endl;
92 std::vector<ankerl::nanobench::Result> benchmarkResults;
93 for (
const auto& [
name, bench_func] : benchmarks()) {
94 const auto& [func, priority_level] = bench_func;
96 if (!(priority_level &
args.priority)) {
100 if (!std::regex_match(
name, baseMatch, reFilter)) {
104 if (
args.is_list_only) {
105 std::cout <<
name << std::endl;
110 if (
args.sanity_check) {
115 if (
args.min_time > 0ms) {
117 std::chrono::nanoseconds min_time_ns =
args.min_time;
121 if (
args.asymptote.empty()) {
124 for (
auto n :
args.asymptote) {
131 if (!bench.results().empty()) {
132 benchmarkResults.push_back(bench.results().back());
136 GenerateTemplateResults(benchmarkResults,
args.output_csv,
"# Benchmark, evals, iterations, total, min, max, median\n" 137 "{{#result}}{{name}}, {{epochs}}, {{average(iterations)}}, {{sumProduct(iterations, elapsed)}}, {{minimum(elapsed)}}, {{maximum(elapsed)}}, {{median(elapsed)}}\n" char const * json() noexcept
Template to generate JSON data.
Bench & epochIterations(uint64_t numIters) noexcept
Sets exactly the number of iterations for each epoch.
Bench & complexityN(T n) noexcept
const std::function< void(const std::string &)> G_TEST_LOG_FUN
This is connected to the logger.
uint8_t StringToPriority(const std::string &str)
void render(char const *mustacheTemplate, Bench const &bench, std::ostream &out)
Renders output from a mustache-like template and benchmark results.
std::map< std::string, uint8_t > map_label_priority
ANKERL_NANOBENCH(NODISCARD) std Bench & name(char const *benchmarkName)
Gets the title of the benchmark.
ANKERL_NANOBENCH(NODISCARD) std ANKERL_NANOBENCH(NODISCARD) std Bench & output(std::ostream *outstream) noexcept
Set the output stream where the resulting markdown table will be printed to.
std::vector< BigO > complexityBigO() const
std::string ListPriorities()
std::function< void(Bench &)> BenchFunction
ANKERL_NANOBENCH(NODISCARD) std Bench & minEpochTime(std::chrono::nanoseconds t) noexcept
Minimum time each epoch should take.
std::map< std::string, std::pair< BenchFunction, PriorityLevel > > BenchmarkMap
const std::function< std::string()> G_TEST_GET_FULL_NAME
Retrieve the unit test name.
Bench & epochs(size_t numEpochs) noexcept
Controls number of epochs, the number of measurements to perform.
Main entry point to nanobench's benchmarking facility.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
const std::function< std::vector< const char * >)> G_TEST_COMMAND_LINE_ARGUMENTS
Retrieve the command line arguments.