[libcxx-commits] [libcxx] r356680 - Add relational benchmark against a string constant.

Samuel Benzaquen via libcxx-commits libcxx-commits at lists.llvm.org
Thu Mar 21 09:06:16 PDT 2019


Author: sbenza
Date: Thu Mar 21 09:06:15 2019
New Revision: 356680

URL: http://llvm.org/viewvc/llvm-project?rev=356680&view=rev
Log:
Add relational benchmark against a string constant.

Summary:
Add relational benchmark against a string constant.
These can potentially trigger inlining of the operations. We want to
benchmark that.

Reviewers: EricWF

Subscribers: christof, jdoerfert, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D59512

Modified:
    libcxx/trunk/benchmarks/string.bench.cpp

Modified: libcxx/trunk/benchmarks/string.bench.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/benchmarks/string.bench.cpp?rev=356680&r1=356679&r2=356680&view=diff
==============================================================================
--- libcxx/trunk/benchmarks/string.bench.cpp (original)
+++ libcxx/trunk/benchmarks/string.bench.cpp Thu Mar 21 09:06:15 2019
@@ -73,16 +73,18 @@ struct AllDiffTypes : EnumValuesAsTuple<
                                           "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 @@ struct StringRelational {
   }
 };
 
+template <class Rel, class LHLength, class DiffType>
+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<AllDepths, Depth, 2> {
   static constexpr const char* Names[] = {"Shallow", "Deep"};
@@ -369,6 +407,8 @@ int main(int argc, char** argv) {
   makeCartesianProductBenchmark<StringDestroy, AllLengths>();
   makeCartesianProductBenchmark<StringRelational, AllRelations, AllLengths,
                                 AllLengths, AllDiffTypes>();
+  makeCartesianProductBenchmark<StringRelationalLiteral, AllRelations,
+                                AllLengths, AllDiffTypes>();
   makeCartesianProductBenchmark<StringRead, AllTemperatures, AllDepths,
                                 AllLengths>();
   benchmark::RunSpecifiedBenchmarks();




More information about the libcxx-commits mailing list