C++ 字符串拼接效率

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;

// append 方式
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;

// sprintf 方式
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;

// stringstream 方式
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 方式。