Add simple benachmark for string builder
This commit is contained in:
parent
33d368397f
commit
39960ccef1
|
@ -0,0 +1,65 @@
|
||||||
|
#include "../conversion/stringbuilder.h"
|
||||||
|
#include "../conversion/stringconversion.h"
|
||||||
|
#include "../chrono/datetime.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace ConversionUtilities;
|
||||||
|
using namespace ChronoUtilities;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
cout << "Benchmarking string builder vs. stringstream" << endl;
|
||||||
|
|
||||||
|
constexpr unsigned int iterations = 500000;
|
||||||
|
constexpr unsigned int iterations2 = 50;
|
||||||
|
|
||||||
|
vector<string> v1, v2;
|
||||||
|
v1.reserve(iterations);
|
||||||
|
v2.reserve(iterations);
|
||||||
|
|
||||||
|
DateTime t1 = DateTime::now();
|
||||||
|
for(unsigned int r = 0; r < iterations2; ++r) {
|
||||||
|
for(unsigned int i = 0; i < iterations; ++i) {
|
||||||
|
stringstream ss;
|
||||||
|
v1.emplace_back("left. " + numberToString(i + 1) + "; right: " + numberToString(i + 2) + "; top: " + numberToString(i + 3) + "; bottom: " + numberToString(i + 4) + ';');
|
||||||
|
}
|
||||||
|
v1.clear();
|
||||||
|
}
|
||||||
|
DateTime t2 = DateTime::now();
|
||||||
|
cout << "plus operator: " << (t2 - t1).toString(TimeSpanOutputFormat::Normal, true) << endl;
|
||||||
|
|
||||||
|
t1 = DateTime::now();
|
||||||
|
for(unsigned int r = 0; r < iterations2; ++r) {
|
||||||
|
for(unsigned int i = 0; i < iterations; ++i) {
|
||||||
|
stringstream ss;
|
||||||
|
ss << "left: " << (i + 1) << "; right: " << (i + 2) << "; top: " << (i + 3) << "; bottom: " << (i + 4) << ';';
|
||||||
|
v1.emplace_back(ss.str());
|
||||||
|
}
|
||||||
|
v1.clear();
|
||||||
|
}
|
||||||
|
t2 = DateTime::now();
|
||||||
|
const TimeSpan diff1 = t2 - t1;
|
||||||
|
cout << "stringstream: " << diff1.toString(TimeSpanOutputFormat::Normal, true) << endl;
|
||||||
|
|
||||||
|
t1 = DateTime::now();
|
||||||
|
for(unsigned int r = 0; r < iterations2; ++r) {
|
||||||
|
for(unsigned int i = 0; i < iterations; ++i) {
|
||||||
|
v2.emplace_back("left. " % numberToString(i + 1) % "; right: " % numberToString(i + 2) % "; top: " % numberToString(i + 3) % "; bottom: " % numberToString(i + 4) + ';');
|
||||||
|
}
|
||||||
|
v2.clear();
|
||||||
|
}
|
||||||
|
t2 = DateTime::now();
|
||||||
|
const TimeSpan diff2 = t2 - t1;
|
||||||
|
cout << "string builder: " << diff2.toString(TimeSpanOutputFormat::Normal, true) << endl;
|
||||||
|
|
||||||
|
v1.swap(v2);
|
||||||
|
|
||||||
|
cout << "diff (stringstream minus string builder): " << (diff1 - diff2).toString(TimeSpanOutputFormat::Normal, true) << endl;
|
||||||
|
cout << "factor (stringstream / string builder): " << (static_cast<double>(diff1.totalTicks()) / diff2.totalTicks()) << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
# Simple/stupid benchmarking
|
||||||
|
|
||||||
|
Compares the string builder and numberToString() function as provided by c++utilities
|
||||||
|
with std::stringstream (without reserving stringstream buffer).
|
||||||
|
|
||||||
|
The string builder is actually just a fancy syntax for std::string::reserve()
|
||||||
|
making its use more convenient.
|
||||||
|
|
||||||
|
## Compile and run
|
||||||
|
|
||||||
|
eg.
|
||||||
|
```
|
||||||
|
g++ -O3 stringbuilder-bench.cpp -o stringbuilder-bench-O3 -Wl,-rpath /lib/path -L /lib/path -lc++utilities
|
||||||
|
./stringbuilder-bench-O3
|
||||||
|
```
|
||||||
|
|
||||||
|
## Results on my machine
|
||||||
|
|
||||||
|
Results with -03:
|
||||||
|
|
||||||
|
```
|
||||||
|
plus operator: 00:00:17
|
||||||
|
stringstream: 00:00:16
|
||||||
|
string builder: 00:00:07
|
||||||
|
diff (stringstream minus string builder): 00:00:09
|
||||||
|
factor (stringstream / string builder): 2.28571
|
||||||
|
```
|
||||||
|
|
||||||
|
However, with -O0 4 times *slower*:
|
||||||
|
|
||||||
|
```
|
||||||
|
plus operator: 00:00:29
|
||||||
|
stringstream: 00:00:16
|
||||||
|
string builder: 00:01:04
|
||||||
|
diff (stringstream minus string builder): - 00:35:22
|
||||||
|
factor (stringstream / string builder): 0.25
|
||||||
|
```
|
||||||
|
|
||||||
|
Still 1.45 times faster than stringstream with -O2:
|
||||||
|
|
||||||
|
```
|
||||||
|
plus operator: 00:00:21
|
||||||
|
stringstream: 00:00:16
|
||||||
|
string builder: 00:00:11
|
||||||
|
diff (stringstream minus string builder): 00:00:05
|
||||||
|
factor (stringstream / string builder): 1.45455
|
||||||
|
```
|
||||||
|
|
||||||
|
So this basic tests show that string builder is up to 2 times faster when using full optimization
|
||||||
|
and still 1.4 times faster when using -O2 (default under Arch Linux). However, this templating
|
||||||
|
stuff completely relies on optimization (as expected). Results with clang++ where similar.
|
Loading…
Reference in New Issue