Index: benchmarks/string.bench.cpp =================================================================== --- benchmarks/string.bench.cpp +++ benchmarks/string.bench.cpp @@ -73,16 +73,18 @@ "ChangeMiddle", "ChangeLast"}; }; +static constexpr char kSmallStringLiteral[] = "012345678"; + TEST_ALWAYS_INLINE const char* getSmallString(DiffType D) { switch (D) { case DiffType::Control: - return "0123456"; + return kSmallStringLiteral; case DiffType::ChangeFirst: - return "-123456"; + return "-12345678"; case DiffType::ChangeMiddle: - return "012-456"; + return "0123-5678"; case DiffType::ChangeLast: - return "012345-"; + return "01234567-"; } } @@ -261,6 +263,42 @@ } }; +template +struct StringRelationalLiteral { + static void run(benchmark::State& state) { + auto Lhs = makeString(LHLength(), DiffType()); + for (auto _ : state) { + benchmark::DoNotOptimize(Lhs); + switch (Rel()) { + case Relation::Eq: + benchmark::DoNotOptimize(Lhs == kSmallStringLiteral); + break; + case Relation::Less: + benchmark::DoNotOptimize(Lhs < kSmallStringLiteral); + break; + case Relation::Compare: + benchmark::DoNotOptimize(Lhs.compare(kSmallStringLiteral)); + break; + } + } + } + + static bool skip() { + // Doesn't matter how they differ if they have different size. + if (LHLength() != Length::Small && DiffType() != ::DiffType::Control) + return true; + // We don't need huge. Doensn't give anything different than Large. + if (LHLength() == Length::Huge) + return true; + return false; + } + + static std::string name() { + return "BM_StringRelationalLiteral" + Rel::name() + LHLength::name() + + DiffType::name(); + } +}; + enum class Depth { Shallow, Deep }; struct AllDepths : EnumValuesAsTuple { static constexpr const char* Names[] = {"Shallow", "Deep"}; @@ -369,6 +407,8 @@ makeCartesianProductBenchmark(); makeCartesianProductBenchmark(); + makeCartesianProductBenchmark(); makeCartesianProductBenchmark(); benchmark::RunSpecifiedBenchmarks();