C 字串連線的效率問題

2021-09-06 07:50:37 字數 1929 閱讀 7226

c#字串連線常用的四種方式:stringbuilder、+、string.format、list。

1.+的方式

string sql = "update tablename set int1=" + int1.tostring() + ",int2=" + int2.tostring() + ",int3=" + int3.tostring() + " where id=" + id.tostring();

編譯器會優化為:

string sql = string.concat(new string );

下面是string.concat的實現:

public

static

string

concat(

params

string

values)

string

strarray = 

newstring

[values.length];

for(

inti = 

0; i < values.length; i++)

}return

concatarray(strarray, totallength);

}private

static

string

concatarray(

string

values, 

inttotallength)

return

dest;

}private

static

unsafe

void

fillstringchecked(

string

dest, 

intdestpos, 

string

src)

fixed

(char

* chref = &dest.m_firstchar)}}

先計算目標字串的長度,然後申請相應的空間,最後逐一複製,時間複雜度為o(n),常數為1。固定數量的字串連線效率最高的是+。但是字串的連+不要拆成多條語句,比如:

string sql = "update tablename set int1=";

sql += int1.tostring();

sql += ...

這樣的**,不會被優化為string.concat,就變成了效能殺手,因為第i個字串需要複製n-i次,時間複雜度就成了o(n^2)。

2.stringbuilder的方式

如果字串的數量不固定,就用stringbuilder,一般情況下它使用2n的空間來保證o(n)的整體時間複雜度,常數項接近於2。

因為這個演算法的實用與高效,.net類庫裡面有很多動態集合都採用這種犧牲空間換

取時間的方式,一般來說效果還是不錯的。

3.string.format的方式

它的底層是stringbuilder,所以其效率與stringbuiler相似。

4.list它可以轉換為string後使用string.concat或string.join,很多時候效率比stringbuiler更高效。

list與stringbuilder採

用的是同樣的動態集合演算法,時間複雜度也是o(n),與stringbuilder不同的是:list的n是字串的數量,複製的是字串的引用;stringbuilder的n是字串的長度,複製的資料。不同的特性決定的它們各自的適應環

境,當子串比較大時建議使用list,因為複製引用比複製資料划算。而當子串比較小,比如平均長度小於8,特別是乙個乙個的字元,建議使用stringbuilder。總結:

1>固定數量的字串連線+的效率是最高的;

2>當字串的數量不固定,並且子串的長度小於8,用stringbuiler的效率高些。

3>當字串的數量不固定,並且子串的長度大於8,用list的效率高些。 

問題 A 字串連線

不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。每一行包括兩個字串,長度不超過100。可能有多組測試資料,對於每組資料,不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸出連線後的字串。abc def abcdef include const in...

問題 A 字串連線

題目描述 不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸入每一行包括兩個字串,長度不超過100。輸出可能有多組測試資料,對於每組資料,不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸出連線後的字串。樣例輸入 copy abc def 樣例輸出...

c 字串連線

string name nihao string spa string str str 常量字串 kowin 常量字串不能直接相加,報錯 str 常量字串 name kowin 可在兩常量字串中間或開頭加變數字串即可 cout cout int n 10 char num 10 str1 str1 ...