| //===- 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 <algorithm> | |
| #include <string> | |
| #include <vector> | |
| 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<string> getFormatStrings(int NumReplacements) { | |
| vector<string> 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<string> 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<vector<string>> 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(); |