2 ms·
I just did a test using std:: and old-fashioned char[]. The fancy std:: is fifteen times slower than the strcat(). In a loop with intensive string manipulation,
by GnarfGnarf 12y ago
I just did a test using std:: and old-fashioned char[]. The fancy std:: is fifteen times slower than the strcat(). In a loop with intensive string manipulation, this could cause the program to get back to you in 15 seconds instead of 1 second. You don't mind waiting?
Here's the code (Visual Studio 2010):
#include <string>
#include <time.h>
char buf[64], buf2[64];
clock_t start = clock();
for(i = 0; i < 100000; i++)
{ _snprintf(buf, sizeof(buf), "%d", i);
_snprintf(buf2, sizeof(buf2), "%d", i * i);
#if defined FAST
strcat(buf, buf2);
#else
std::string s1 = buf;
std::string s2 = buf2;
std::string s3 = s1 + s2;
#endif
}
_snprintf(buf, sizeof(buf), "%.4f\n", (float)(clock() - start) / (float)CLK_TCK);
OutputDebugString(buf);
- theseoafs 12y agoYou should be using `+=` to build strings incrementally in C++, not using `+` repeatedly.
- 30thElement 12y agoWell of course you're getting a speed difference, look at how much extra work you're doing in the std::string code! The char[64]s are allocated once but you reallocate the std::strings every time. By pulling the declaration of s1, s2, and s3 to the top, I'm getting equivalent speed (g++ 4.4.7 with -g, 0.02s each time, clock() isn't any more accurate). And for essentially no runtime cost, you're getting memory safety and exception safety. C++ is all about low-cost abstractions. Any speed difference between the C++ way and the C way should be very small, and the C++ way is safer. Use std::string (and std::vector and all the rest) unless you have a very good reason not too, and then you should probably just write your own custom implementation. Reverting to the C way is just asking for issues.
- GnarfGnarf 12y agoI moved the std::string allocation outside the loop, now it's only ten times slower. I'm all for using abstractions and working smarter, but why pay such a performance penalty?
- theseoafs 12y agoAre you using += like I suggested in my comment?