1. 程式人生 > >c++拼接字串效率比較(+=、append、stringstream、sprintf)

c++拼接字串效率比較(+=、append、stringstream、sprintf)

最近寫的程式用到大量拼接字串,為了提高拼接效率,比較了一下+=、append、stringstream、sprintf四種拼接字串的方法。

測試方法

比較方法是寫了4個函式,分別用+=、append、stringstream、sprintf的方式來拼接字串,拼接方法是將s1="abcedfg",s2="hijklmn",s3="opqrst"三個字串拼接到一起,總共迴圈60次。然後在main函式中依次呼叫這4個函式,並打時間戳來計時。為了使時間差異更明顯,可以取迴圈N(N可以為100或是1000000等)次呼叫的時間。程式碼如下:
#include <iostream>
#include <string>
#include <sys/time.h> #include <sstream> #include <stdio.h> using namespace std; #define OUT_IN_REPEATE_NUM 10000 #define IN_REPEATE_NUM 60 string s1="abcedfg"; string s2="hijklmn"; string s3="opqrst"; void plusTest(string& ret) { for(int i=0; i<IN_REPEATE_NUM; i++) { ret += s1; ret += s2; ret += s3; } } void
appendTest(string& ret) { for(int i=0; i<IN_REPEATE_NUM; i++) { ret.append(s1); ret.append(s2); ret.append(s3); } } void sprintfTest(string& ret) { const size_t length=26*IN_REPEATE_NUM; char tmp[length]; char* cp = tmp; size_t strLength=s1.length()+s2.length()+s3.length(); for
(int i=0; i<IN_REPEATE_NUM; i++) { sprintf(cp,"%s%s%s", s1.c_str(), s2.c_str(),s3.c_str()); cp+=strLength; } ret = tmp; } void ssTest(string& ret) { stringstream ss; for(int i=0; i<IN_REPEATE_NUM; i++) { ss<<s1; ss<<s2; ss<<s3; } ret = ss.str(); } int main() { string ss, plus, append, sprintf; struct timeval sTime, eTime; gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { sprintf=""; sprintfTest(sprintf); } gettimeofday(&eTime, NULL); long SprintfTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { append=""; appendTest(append); } gettimeofday(&eTime, NULL); long AppendTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { ss=""; ssTest(ss); } gettimeofday(&eTime, NULL); long SsTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 gettimeofday(&sTime, NULL); for(int i=0; i<OUT_IN_REPEATE_NUM; i++) { plus=""; plusTest(plus); } gettimeofday(&eTime, NULL); long PlusTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 單位是微秒 cout<<"PlusTime is : "<<PlusTime<<endl; cout<<"AppendTime is : "<<AppendTime<<endl; cout<<"SsTime is : "<<SsTime<<endl; cout<<"SprintfTime is :"<<SprintfTime<<endl; if(ss==sprintf && append==plus && ss==plus) { cout<<"They are same"<<endl; } else { cout<<"Different!"<<endl; cout<<"Sprintf: "<<sprintf<<endl; cout<<"ss: "<<ss<<endl; cout<<"Plus: "<<plus<<endl; cout<<"Append:"<<append<<endl; } }

測試結果:

在Linux環境下用g++編譯以上程式碼,執行結果如下(時間單位為μm):
這裡寫圖片描述

結論:

根據以上結果,如果是使用Linux系統並且是g++(gcc)編譯器,大量拼接字串的效率從高到低依次為:+=、append()、stringstream、sprintf()。