4 ms·
I've often heard it said that if you're not using std::string for strings in C++, you're (arguably) not using C++
by dkersten 12y ago
I've often heard it said that if you're not using std::string for strings in C++, you're (arguably) not using C++
- GnarfGnarf 12y agoI 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?