Commit d6c4dda1 authored by Soren Lassen's avatar Soren Lassen Committed by Jordan DeLong

Remove unnecessary branch in Range::find_first_of(Range,size_t)

Summary:
Added benchmarks.

Before:

folly/test/RangeFindBenchmark.cpp               relative  time/iter  iters/s
============================================================================
string length 10:
FindFirstOfRange                                             1.36ns  733.07M
FindFirstOfOffsetRange                                       2.15ns  464.16M
============================================================================
string length 256:
FindFirstOfRange                                             1.36ns  733.07M
FindFirstOfOffsetRange                                       1.42ns  704.22M
============================================================================
string length 10240:
FindFirstOfRange                                             1.36ns  733.07M
FindFirstOfOffsetRange                                       3.72ns  268.70M
============================================================================
string length 10485760:
FindFirstOfRange                                             1.36ns  733.07M
FindFirstOfOffsetRange                                       5.00ns  199.96M

After:

string length 10:
FindFirstOfRange                                             1.36ns  732.92M
FindFirstOfOffsetRange                                       1.36ns  732.61M
============================================================================
string length 256:
FindFirstOfRange                                             1.36ns  732.93M
FindFirstOfOffsetRange                                       1.38ns  727.16M
============================================================================
string length 10240:
FindFirstOfRange                                             1.36ns  732.93M
FindFirstOfOffsetRange                                       1.79ns  558.40M
============================================================================
string length 10485760:
FindFirstOfRange                                             1.36ns  732.93M
FindFirstOfOffsetRange                                       2.73ns  366.44M

Test Plan: fbconfig folly && fbmake runtests

Reviewed By: delong.j@fb.com

FB internal diff: D660125
parent 83da0042
...@@ -387,7 +387,7 @@ public: ...@@ -387,7 +387,7 @@ public:
size_type find_first_of(Range needles, size_t pos) const { size_type find_first_of(Range needles, size_t pos) const {
if (pos > size()) return std::string::npos; if (pos > size()) return std::string::npos;
size_type ret = qfind_first_of(pos ? subpiece(pos) : *this, needles); size_type ret = qfind_first_of(subpiece(pos), needles);
return ret == npos ? ret : ret + pos; return ret == npos ? ret : ret + pos;
} }
......
...@@ -48,7 +48,7 @@ BENCHMARK(FindSingleCharMemchr, n) { ...@@ -48,7 +48,7 @@ BENCHMARK(FindSingleCharMemchr, n) {
} }
BENCHMARK_RELATIVE(FindSingleCharRange, n) { BENCHMARK_RELATIVE(FindSingleCharRange, n) {
char c = 'b'; const char c = 'b';
StringPiece haystack(str); StringPiece haystack(str);
folly::StringPiece needle(&c, &c + 1); folly::StringPiece needle(&c, &c + 1);
FOR_EACH_RANGE (i, 0, n) { FOR_EACH_RANGE (i, 0, n) {
...@@ -58,6 +58,29 @@ BENCHMARK_RELATIVE(FindSingleCharRange, n) { ...@@ -58,6 +58,29 @@ BENCHMARK_RELATIVE(FindSingleCharRange, n) {
} }
} }
BENCHMARK_DRAW_LINE();
BENCHMARK(FindFirstOfRange, n) {
StringPiece haystack(str);
folly::StringPiece needle("ab");
FOR_EACH_RANGE (i, 0, n) {
doNotOptimizeAway(haystack.find_first_of(needle));
char x = haystack[0];
doNotOptimizeAway(&x);
}
}
BENCHMARK(FindFirstOfOffsetRange, n) {
StringPiece haystack(str);
folly::StringPiece needle("ab");
FOR_EACH_RANGE (i, 0, n) {
size_t pos = i / 2; // not a constant to prevent optimization
doNotOptimizeAway(haystack.find_first_of(needle, pos));
char x = haystack[0];
doNotOptimizeAway(&x);
}
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
google::ParseCommandLineFlags(&argc, &argv, true); google::ParseCommandLineFlags(&argc, &argv, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment