[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