C++之拼接長字符串問題
c++ string 類型提供 opearator+= 以及 append 方法進(jìn)行字符串拼接,本文探討c++拼接長字符串執(zhí)行效率最高的方法。
以下是四種實現(xiàn)方式。
實現(xiàn)方式
operator +=
使用 string 類提供重載 += 方法拼接字符串。示例:
// length 參數(shù)代表拼接的字符串長度 void composeLongstringWithOperator(const unsigned int length,std::string& long_string) { for (size_t i = 0; i < length / 9; i++) { char str[10]; // randStr 方法構(gòu)造長度為9的隨機(jī)字符串 long_string += (randStr(str,9)); } }
append
使用 string 類提供的append 方法拼接字符串。示例:
void composeLongstringWithAppend(const unsigned int length,std::string& long_string) { for (size_t i = 0; i < length / 9; i++) { char str[10]; long_string.append(randStr(str,9)); } }
reserve && operator +=
在拼接字符串之前為string 對象提前分配空間,然后使用 += 方法進(jìn)行拼接,示例:
void composeLongstringWithReserveAndOperator(const unsigned int length,std::string& long_string) { long_string.reserve(length); for (size_t i = 0; i < length / 9; i++) { char str[10]; long_string += (randStr(str,9)); } }
性能測試
測試方法
進(jìn)行10000次長字符串拼接,統(tǒng)計每種方式下耗時,示例代碼如下:
#include <iostream> #include <string> #include <ctime> #include <chrono> char* randStr(char* str,const int len) { ? ? int i; ? ? for(i = 0; i < len; ++i) ? ? { ? ? ? ? str[i] = 'A' + rand() % 26; ? ? } ? ? str[++i] = '\0'; ? ? return str; } int main(int argc, char* argv[]) { ? ? (void) argc; ? ? // 第一個參數(shù)代表生成的字符串的長度 ? ? const unsigned int length = atoi(argv[1]); ? ? // 第二個參數(shù)代表使用哪種方法進(jìn)行拼接 ? ? const unsigned int type = atoi(argv[2]); ? ? srand(time(NULL)); ? ? auto start = std::chrono::high_resolution_clock::now(); ? ? switch(type) ? ? { ? ? ? ? case 1: ? ? ? ? ? ? std::cout << "composeLongstringWithReserveAndAppend"; ? ? ? ? ? ? for(int i = 0; i < 10000; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? std::string long_string; ? ? ? ? ? ? ? ? composeLongstringWithReserveAndAppend(length,long_string); ? ? ? ? ? ? } ? ? ? ? ? ? break; ? ? ? ? case 2: ? ? ? ? ? ? std::cout << "composeLongstringWithReserveAndOperator"; ? ? ? ? ? ? for(int i = 0; i < 10000; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? std::string long_string; ? ? ? ? ? ? ? ? composeLongstringWithReserveAndOperator(length,long_string); ? ? ? ? ? ? } ? ? ? ? ? ? break; ? ? ? ? case 3: ? ? ? ? ? ? std::cout << "composeLongstringWithAppend"; ? ? ? ? ? ? for(int i = 0; i < 10000; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? std::string long_string; ? ? ? ? ? ? ? ? composeLongstringWithAppend(length,long_string); ? ? ? ? ? ? } ? ? ? ? ? ? break; ? ? ? ? case 4: ? ? ? ? ? ? std::cout << "composeLongstringWithOperator"; ? ? ? ? ? ? for(int i = 0; i < 10000; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? std::string long_string; ? ? ? ? ? ? ? ? composeLongstringWithOperator(length,long_string); ? ? ? ? ? ? } ? ? ? ? ? ? break; ? ? ? ? default: ? ? ? ? ? ? return 0; ? ? } ? ? auto end = std::chrono::high_resolution_clock::now(); ? ? std::chrono::duration<double> diff = end - start; ? ? std::cout << " cost " << 1000 * diff.count() << " ms\n"; ? ? return 0; }
編譯
g++ -std=c++11 -O3 compose_long_string.cpp -o compose_long_string
性能表現(xiàn)
長字符串長度為1000000,每種方法進(jìn)行10000次拼接,
四種方法的耗時如下:
method | cost (ms) |
---|---|
reserve && append | 117304 |
reserve && operator | 122998 |
append | 125682 |
operator | 129071 |
結(jié)論
針對較短字符串,使用reserve提前分配空間對性能提升意義不大,當(dāng)字符串的長度很長是,使用reserve方法提前分配空間可以帶來比較大的性能提升。
operator+= 和 append 方法在進(jìn)行字符串拼接時性能表現(xiàn)幾乎一致。原因是stl 實現(xiàn)的operator+= 方式實際是直接調(diào)用了append 方法。
綜上,拼接長字符串時最優(yōu)方式是 reserve && append。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中g(shù)etline()、gets()等函數(shù)的用法詳解
這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02C語言sizeof和strlen的指針和數(shù)組面試題詳解
strlen是函數(shù),字符串長度,不包括停止符。而sizeof則是內(nèi)存塊的大小,包括停止符。數(shù)組是一種數(shù)據(jù)類型,數(shù)據(jù)類型的本質(zhì)就是固定大小,內(nèi)存塊的別名??梢杂胹izeof()一般都是數(shù)據(jù)類型2022-04-04C++迭代器介紹(iterator、const_iterator、reverse_interator、const_rev
這篇文章主要介紹了C++迭代器介紹(iterator、const_iterator、reverse_interator、const_reverse_interator),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02C語言實現(xiàn)linux網(wǎng)卡檢測改進(jìn)版
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)linux網(wǎng)卡檢測的改進(jìn)版,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06