//===- FormatVariadicBM.cpp - formatv() benchmark ---------- --------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "benchmark/benchmark.h" #include "llvm/Support/FormatVariadic.h" #include #include #include using namespace llvm; using namespace std; // Generate a list of format strings that have `NumReplacements` replacements // by permuting the replacements and some literal text. static vector getFormatStrings(int NumReplacements) { vector Components; for (int I = 0; I < NumReplacements; I++) Components.push_back("{" + to_string(I) + "}"); // Intersperse these with some other literal text (_). const string_view Literal = "____"; for (char C : Literal) Components.push_back(string(1, C)); vector Formats; do { string Concat; for (const string &C : Components) Concat += C; Formats.emplace_back(Concat); } while (next_permutation(Components.begin(), Components.end())); return Formats; } // Generate the set of formats to exercise outside the benchmark code. static const vector> Formats = { getFormatStrings(1), getFormatStrings(2), getFormatStrings(3), getFormatStrings(4), getFormatStrings(5), }; // Benchmark formatv() for a variety of format strings and 1-5 replacements. static void BM_FormatVariadic(benchmark::State &state) { for (auto _ : state) { for (const string &Fmt : Formats[0]) formatv(Fmt.c_str(), 1).str(); for (const string &Fmt : Formats[1]) formatv(Fmt.c_str(), 1, 2).str(); for (const string &Fmt : Formats[2]) formatv(Fmt.c_str(), 1, 2, 3).str(); for (const string &Fmt : Formats[3]) formatv(Fmt.c_str(), 1, 2, 3, 4).str(); for (const string &Fmt : Formats[4]) formatv(Fmt.c_str(), 1, 2, 3, 4, 5).str(); } } BENCHMARK(BM_FormatVariadic); BENCHMARK_MAIN();