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 llvm-svn: 356680
This commit is contained in:
parent
7028cedafe
commit
9b7aa02b53
|
@ -73,16 +73,18 @@ struct AllDiffTypes : EnumValuesAsTuple<AllDiffTypes, DiffType, 4> {
|
||||||
"ChangeMiddle", "ChangeLast"};
|
"ChangeMiddle", "ChangeLast"};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr char kSmallStringLiteral[] = "012345678";
|
||||||
|
|
||||||
TEST_ALWAYS_INLINE const char* getSmallString(DiffType D) {
|
TEST_ALWAYS_INLINE const char* getSmallString(DiffType D) {
|
||||||
switch (D) {
|
switch (D) {
|
||||||
case DiffType::Control:
|
case DiffType::Control:
|
||||||
return "0123456";
|
return kSmallStringLiteral;
|
||||||
case DiffType::ChangeFirst:
|
case DiffType::ChangeFirst:
|
||||||
return "-123456";
|
return "-12345678";
|
||||||
case DiffType::ChangeMiddle:
|
case DiffType::ChangeMiddle:
|
||||||
return "012-456";
|
return "0123-5678";
|
||||||
case DiffType::ChangeLast:
|
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 };
|
enum class Depth { Shallow, Deep };
|
||||||
struct AllDepths : EnumValuesAsTuple<AllDepths, Depth, 2> {
|
struct AllDepths : EnumValuesAsTuple<AllDepths, Depth, 2> {
|
||||||
static constexpr const char* Names[] = {"Shallow", "Deep"};
|
static constexpr const char* Names[] = {"Shallow", "Deep"};
|
||||||
|
@ -369,6 +407,8 @@ int main(int argc, char** argv) {
|
||||||
makeCartesianProductBenchmark<StringDestroy, AllLengths>();
|
makeCartesianProductBenchmark<StringDestroy, AllLengths>();
|
||||||
makeCartesianProductBenchmark<StringRelational, AllRelations, AllLengths,
|
makeCartesianProductBenchmark<StringRelational, AllRelations, AllLengths,
|
||||||
AllLengths, AllDiffTypes>();
|
AllLengths, AllDiffTypes>();
|
||||||
|
makeCartesianProductBenchmark<StringRelationalLiteral, AllRelations,
|
||||||
|
AllLengths, AllDiffTypes>();
|
||||||
makeCartesianProductBenchmark<StringRead, AllTemperatures, AllDepths,
|
makeCartesianProductBenchmark<StringRead, AllTemperatures, AllDepths,
|
||||||
AllLengths>();
|
AllLengths>();
|
||||||
benchmark::RunSpecifiedBenchmarks();
|
benchmark::RunSpecifiedBenchmarks();
|
||||||
|
|
Loading…
Reference in New Issue