Skip to content

Commit ab543ab

Browse files
committed
Containers: benchmark also String::find[Last]() with small sizes.
To test the scalar fallback for less than 16 bytes. Had to patch the test data to have spaces also inside the paragraph breaks, as it's a too large range without a space otherwise.
1 parent 272e8ef commit ab543ab

File tree

2 files changed

+92
-5
lines changed

2 files changed

+92
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin suscipit pharetra elit, vel ornare dui sollicitudin vel. Sed bibendum erat ex, at gravida risus rhoncus a. Sed non placerat ipsum, vitae mattis metus. Duis libero nisi, ullamcorper euismod mauris sit amet, vulputate mollis leo. Vivamus rhoncus ante et nunc lobortis lobortis. Donec elementum felis id lorem volutpat, sed varius lectus blandit. Ut sit amet elit et diam eleifend tincidunt. Vivamus rutrum consequat euismod. Nullam pretium felis eget arcu tincidunt congue. Fusce at suscipit tellus. Sed efficitur leo at ligula tempus, eget dignissim ex lobortis.
22

3-
Maecenas sit amet ligula metus. Phasellus non pretium felis. Suspendisse at metus in magna viverra sollicitudin. Etiam felis lectus, facilisis ac malesuada non, laoreet sed arcu. Nulla congue nulla justo, vitae elementum massa mollis eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam commodo sapien enim, eleifend tempor leo feugiat a. Integer tincidunt, ligula at vulputate posuere, nulla diam sollicitudin augue, vitae suscipit lectus lorem nec risus. Duis ex metus, elementum sed libero scelerisque, faucibus sollicitudin elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ultrices tortor, in fringilla augue. In magna nibh, molestie id lacinia ut, hendrerit sit amet lacus.
3+
Maecenas sit amet ligula metus. Phasellus non pretium felis. Suspendisse at metus in magna viverra sollicitudin. Etiam felis lectus, facilisis ac malesuada non, laoreet sed arcu. Nulla congue nulla justo, vitae elementum massa mollis eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam commodo sapien enim, eleifend tempor leo feugiat a. Integer tincidunt, ligula at vulputate posuere, nulla diam sollicitudin augue, vitae suscipit lectus lorem nec risus. Duis ex metus, elementum sed libero scelerisque, faucibus sollicitudin elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ultrices tortor, in fringilla augue. In magna nibh, molestie id lacinia ut, hendrerit sit amet lacus.
44

5-
Pellentesque ac risus sed ligula condimentum consectetur. Ut eu dolor faucibus justo consectetur imperdiet nec id risus. Etiam sodales blandit est, et consectetur ex rutrum ut. Nullam at dignissim lorem. Cras non neque a sem malesuada tincidunt et nec elit. Vivamus dignissim elit eu auctor eleifend. Donec convallis quam eu aliquet gravida. Curabitur porttitor ipsum lectus, quis varius ex vulputate ut.
5+
Pellentesque ac risus sed ligula condimentum consectetur. Ut eu dolor faucibus justo consectetur imperdiet nec id risus. Etiam sodales blandit est, et consectetur ex rutrum ut. Nullam at dignissim lorem. Cras non neque a sem malesuada tincidunt et nec elit. Vivamus dignissim elit eu auctor eleifend. Donec convallis quam eu aliquet gravida. Curabitur porttitor ipsum lectus, quis varius ex vulputate ut.
66

7-
Morbi a mattis nunc. Mauris suscipit orci eget nibh tincidunt aliquet. Praesent maximus ullamcorper ligula sed pellentesque. In hac habitasse platea dictumst. Suspendisse at purus nisl. Curabitur quis odio est. Ut tempor nunc quis magna euismod, vitae interdum massa faucibus. Ut in porta mauris, rhoncus hendrerit mi. Quisque orci lacus, malesuada vel augue eget, ultricies pretium nisi. Suspendisse metus ex, tristique ac facilisis at, bibendum vel eros. Integer eleifend nibh a diam malesuada, in lacinia leo condimentum. Duis dignissim rutrum odio, nec feugiat sapien elementum nec. Donec quis augue elit. Cras laoreet, sapien sed rhoncus dapibus, ligula mauris placerat enim, sed mattis sem ipsum sit amet mi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed imperdiet purus urna, volutpat dictum ante interdum in.
7+
Morbi a mattis nunc. Mauris suscipit orci eget nibh tincidunt aliquet. Praesent maximus ullamcorper ligula sed pellentesque. In hac habitasse platea dictumst. Suspendisse at purus nisl. Curabitur quis odio est. Ut tempor nunc quis magna euismod, vitae interdum massa faucibus. Ut in porta mauris, rhoncus hendrerit mi. Quisque orci lacus, malesuada vel augue eget, ultricies pretium nisi. Suspendisse metus ex, tristique ac facilisis at, bibendum vel eros. Integer eleifend nibh a diam malesuada, in lacinia leo condimentum. Duis dignissim rutrum odio, nec feugiat sapien elementum nec. Donec quis augue elit. Cras laoreet, sapien sed rhoncus dapibus, ligula mauris placerat enim, sed mattis sem ipsum sit amet mi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed imperdiet purus urna, volutpat dictum ante interdum in.
88

9-
Mauris a massa pharetra, gravida ligula a, fringilla orci. Praesent tempor pretium pretium. Mauris tincidunt pellentesque maximus. Quisque eget mauris diam. In nec porttitor felis, et finibus mauris. Donec quis quam risus. Vivamus blandit ornare massa, in vulputate purus tincidunt a. Nam at erat non lorem iaculis faucibus. Nulla eu magna odio. Mauris dignissim tempor velit, ut pretium eros dignissim id. Duis fermentum viverra lectus ut dapibus. Nullam id turpis efficitur velit iaculis varius vitae vel nunc. Morbi urna velit, consequat mollis dui nec, vestibulum dictum tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque in pulvinar lacus, et vulputate turpis.
9+
Mauris a massa pharetra, gravida ligula a, fringilla orci. Praesent tempor pretium pretium. Mauris tincidunt pellentesque maximus. Quisque eget mauris diam. In nec porttitor felis, et finibus mauris. Donec quis quam risus. Vivamus blandit ornare massa, in vulputate purus tincidunt a. Nam at erat non lorem iaculis faucibus. Nulla eu magna odio. Mauris dignissim tempor velit, ut pretium eros dignissim id. Duis fermentum viverra lectus ut dapibus. Nullam id turpis efficitur velit iaculis varius vitae vel nunc. Morbi urna velit, consequat mollis dui nec, vestibulum dictum tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque in pulvinar lacus, et vulputate turpis.

src/Corrade/Containers/Test/StringViewBenchmark.cpp

+88-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "Corrade/Containers/StringView.h"
3232
#include "Corrade/Containers/StringStl.h"
3333
#include "Corrade/TestSuite/Tester.h"
34+
#include "Corrade/Utility/Math.h"
3435
#include "Corrade/Utility/Path.h"
3536

3637
#include "configure.h"
@@ -49,6 +50,11 @@ struct StringViewBenchmark: TestSuite::Tester {
4950
void findCharacterCommonMemchr();
5051
void findCharacterCommonStlString();
5152

53+
void findCharacterCommonSmall();
54+
void findCharacterCommonSmallMemchr();
55+
/* No std::string variant as the overhead from slicing would make this
56+
useless (and no, find() has no end position) */
57+
5258
void findCharacterRare();
5359
void findCharacterRareNaive();
5460
void findCharacterRareMemchr();
@@ -59,6 +65,11 @@ struct StringViewBenchmark: TestSuite::Tester {
5965
void findLastCharacterCommonMemrchr();
6066
void findLastCharacterCommonStlString();
6167

68+
void findLastCharacterCommonSmall();
69+
void findLastCharacterCommonSmallMemrchr();
70+
/* No std::string variant as the overhead from slicing would make this
71+
useless (and no, rfind() has no end position) */
72+
6273
void findLastCharacterRare();
6374
void findLastCharacterRareNaive();
6475
void findLastCharacterRareMemrchr();
@@ -73,6 +84,9 @@ StringViewBenchmark::StringViewBenchmark() {
7384
&StringViewBenchmark::findCharacterCommonMemchr,
7485
&StringViewBenchmark::findCharacterCommonStlString,
7586

87+
&StringViewBenchmark::findCharacterCommonSmall,
88+
&StringViewBenchmark::findCharacterCommonSmallMemchr,
89+
7690
&StringViewBenchmark::findCharacterRare,
7791
&StringViewBenchmark::findCharacterRareNaive,
7892
&StringViewBenchmark::findCharacterRareMemchr,
@@ -83,13 +97,16 @@ StringViewBenchmark::StringViewBenchmark() {
8397
&StringViewBenchmark::findLastCharacterCommonMemrchr,
8498
&StringViewBenchmark::findLastCharacterCommonStlString,
8599

100+
&StringViewBenchmark::findLastCharacterCommonSmall,
101+
&StringViewBenchmark::findLastCharacterCommonSmallMemrchr,
102+
86103
&StringViewBenchmark::findLastCharacterRare,
87104
&StringViewBenchmark::findLastCharacterRareNaive,
88105
&StringViewBenchmark::findLastCharacterRareMemrchr,
89106
&StringViewBenchmark::findLastCharacterRareStlString}, 100);
90107
}
91108

92-
constexpr std::size_t CommonCharacterCount = 496;
109+
constexpr std::size_t CommonCharacterCount = 500;
93110
constexpr std::size_t RareCharacterCount = 90;
94111
constexpr std::size_t CharacterRepeats = 100;
95112

@@ -168,6 +185,39 @@ void StringViewBenchmark::findCharacterCommonStlString() {
168185
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
169186
}
170187

188+
void StringViewBenchmark::findCharacterCommonSmall() {
189+
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
190+
CORRADE_VERIFY(text);
191+
192+
std::size_t count = 0;
193+
CORRADE_BENCHMARK(CharacterRepeats) {
194+
StringView a = *text;
195+
while(StringView found = a.prefix(Utility::min(std::size_t{15}, a.size())).find(' ')) {
196+
++count;
197+
a = a.suffix(found.end());
198+
}
199+
}
200+
201+
202+
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
203+
}
204+
205+
void StringViewBenchmark::findCharacterCommonSmallMemchr() {
206+
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
207+
CORRADE_VERIFY(text);
208+
209+
std::size_t count = 0;
210+
CORRADE_BENCHMARK(CharacterRepeats) {
211+
const char* a = text->data();
212+
while(const char* found = static_cast<const char*>(std::memchr(a, ' ', Utility::min(std::ptrdiff_t{15}, text->end() - a)))) {
213+
++count;
214+
a = found + 1;
215+
}
216+
}
217+
218+
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
219+
}
220+
171221
void StringViewBenchmark::findCharacterRare() {
172222
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
173223
CORRADE_VERIFY(text);
@@ -326,6 +376,43 @@ void StringViewBenchmark::findLastCharacterCommonStlString() {
326376
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
327377
}
328378

379+
void StringViewBenchmark::findLastCharacterCommonSmall() {
380+
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
381+
CORRADE_VERIFY(text);
382+
383+
std::size_t count = 0;
384+
CORRADE_BENCHMARK(CharacterRepeats) {
385+
StringView a = *text;
386+
/** @todo use suffix() once it takes suffix size */
387+
while(StringView found = a.exceptPrefix(Utility::max(std::ptrdiff_t{0}, std::ptrdiff_t(a.size()) - 15)).findLast(' ')) {
388+
++count;
389+
a = a.prefix(found.begin());
390+
}
391+
}
392+
393+
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
394+
}
395+
396+
void StringViewBenchmark::findLastCharacterCommonSmallMemrchr() {
397+
#if !defined(__GLIBC__) && !defined(__BIONIC__) && !defined(CORRADE_TARGET_EMSCRIPTEN)
398+
CORRADE_SKIP("memrchr() not available");
399+
#else
400+
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
401+
CORRADE_VERIFY(text);
402+
403+
std::size_t count = 0;
404+
CORRADE_BENCHMARK(CharacterRepeats) {
405+
std::size_t end = text->size();
406+
while(const char* found = static_cast<const char*>(memrchr(text->begin() + Utility::max(std::ptrdiff_t{0}, std::ptrdiff_t(end) - 15), ' ', end - Utility::max(std::ptrdiff_t{0}, std::ptrdiff_t(end) - 15)))) {
407+
++count;
408+
end = found - text->begin();
409+
}
410+
}
411+
412+
CORRADE_COMPARE(count, CommonCharacterCount*CharacterRepeats);
413+
#endif
414+
}
415+
329416
void StringViewBenchmark::findLastCharacterRare() {
330417
Containers::Optional<Containers::String> text = Utility::Path::readString(Utility::Path::join(CONTAINERS_TEST_DIR, "StringTestFiles/lorem-ipsum.txt"));
331418
CORRADE_VERIFY(text);

0 commit comments

Comments
 (0)