C++之拼接長字符串問題
c++ string 類型提供 opearator+= 以及 append 方法進(jìn)行字符串拼接,本文探討c++拼接長字符串執(zhí)行效率最高的方法。
以下是四種實(shí)現(xiàn)方式。
實(shí)現(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 對(duì)象提前分配空間,然后使用 += 方法進(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)計(jì)每種方式下耗時(shí),示例代碼如下:
#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;
? ? // 第一個(gè)參數(shù)代表生成的字符串的長度
? ? const unsigned int length = atoi(argv[1]);
? ? // 第二個(gè)參數(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次拼接,
四種方法的耗時(shí)如下:
| method | cost (ms) |
|---|---|
| reserve && append | 117304 |
| reserve && operator | 122998 |
| append | 125682 |
| operator | 129071 |
結(jié)論
針對(duì)較短字符串,使用reserve提前分配空間對(duì)性能提升意義不大,當(dāng)字符串的長度很長是,使用reserve方法提前分配空間可以帶來比較大的性能提升。
operator+= 和 append 方法在進(jìn)行字符串拼接時(shí)性能表現(xiàn)幾乎一致。原因是stl 實(shí)現(xiàn)的operator+= 方式實(shí)際是直接調(diào)用了append 方法。
綜上,拼接長字符串時(shí)最優(yōu)方式是 reserve && append。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C語言動(dòng)態(tài)內(nèi)存管理介紹
大家好,本篇文章主要講的是關(guān)于C語言動(dòng)態(tài)內(nèi)存管理介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C++20新特性之std::jthread和chrono庫擴(kuò)展
C++20標(biāo)準(zhǔn)庫特性2.3 std::jthread2.3.1 jthread 語法格式 常用方法2.3.2 總結(jié)2.4 chrono庫擴(kuò)展2.4.1 語法格式與核心概念2.4.1.1 日歷類型創(chuàng)建2.4.1.2 ok() 判斷有效性2.4.1.3 常用方法2.4.2 舉例 本文記錄2026-06-06
c語言實(shí)現(xiàn)從源文件從文本到可執(zhí)行文件經(jīng)歷的過程
這篇文章主要介紹了c語言實(shí)現(xiàn)從源文件從文本到可執(zhí)行文件經(jīng)歷的過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C++實(shí)現(xiàn)簡單的信息管理系統(tǒng)
這篇文章主要為大家介紹了C++實(shí)現(xiàn)簡單的信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04

