C++字符串拼接效率
c++ 提供了 +=、append、stringstream、sprintf
这四种方式来拼接字符串。关于他们之间的性能做一个对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| class StringEfficiency { public: StringEfficiency() { genStrArr(); }
void plusTest() { std::string res; for (int i = 0;i < 10000; i++) { res += vec[i]; } }
void appendTest() { std::string res; for (int i = 0; i < 100000; i++) { res.append(vec[i]); } }
void sprintfTest() { char res[500000] = {0}; char* cp = res; for (int i = 0; i < 100000; i += 3) { sprintf(cp, "%s%s%s", vec[i].c_str(), vec[i+1].c_str(), vec[i+2].c_str()); cp += 15; } res[10] = 0; }
void ssTest() { std::stringstream ss; for (int i = 0; i < 100000; i += 3) { ss << vec[i]; ss << vec[i+1]; ss << vec[i+2]; } }
private: void genStrArr() { srand((unsigned)time(nullptr)); for (int i = 0; i < 100000; i++) { std::string str; for (int j = 0; j < 5; j++) { str.push_back('a' + rand() % 27); } vec.emplace_back(str); } }
private: std::vector<std::string> vec; };
int main() { auto* se = new StringEfficiency();
struct timeval startTime{}, endTime{}; gettimeofday(&startTime, nullptr); for (int i = 0; i < 1000; i++) { se->plusTest(); } gettimeofday(&endTime, nullptr); long plusTime = (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec); std::cout << "+= way cost time: " << plusTime << " us" << std::endl;
gettimeofday(&startTime, nullptr); for (int i = 0; i < 1000; i++) { se->appendTest(); } gettimeofday(&endTime, nullptr); long appendTime = (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec); std::cout << "append way cost time: " << appendTime << " us" << std::endl;
gettimeofday(&startTime, nullptr); for (int i = 0; i < 1000; i++) { se->sprintfTest(); } gettimeofday(&endTime, nullptr); long sprintfTime = (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec); std::cout << "sprintf way cost time: " << sprintfTime << " us" << std::endl;
gettimeofday(&startTime, nullptr); for (int i = 0; i < 1000; i++) { se->ssTest(); } gettimeofday(&endTime, nullptr); long ssTime = (endTime.tv_sec - startTime.tv_sec)*1000000 + (endTime.tv_usec - startTime.tv_usec); std::cout << "stringstream way cost time: " << ssTime << " us" << std::endl;
delete se; }
|
环境:
1 2 3
| c++11 2.6 GHz 六核Intel Core i7 16G
|
输出如下:
1 2 3 4
| += way cost time: 425251 us append way cost time: 3932957 us sprintf way cost time: 5121372 us stringstream way cost time: 7276496 us
|
因此,我们可以看到 +=
方式的效率最高。接下来依次是 append、sprintf、stringstream
方式。