int z=0;x=0; public string GetDynStr() ...{ string a = "abcdefghijklmnopqrstuvwxyz : "; if (z == x) ...{ a += "abcdefghijklmnopqrstuvwxyz"; } return a; }
Compiler後,程式碼並沒有改變,而耗時為14毫秒.
String 動態少量字串做法 2 (十萬次) :
測試寫法跟做法1一樣,只不過是使用StringBuilder把它串起來
public string GetDynStrBu() ...{ StringBuilder s = new StringBuilder(); s.Append("abcdefghijklmnopqrstuvwxyz : "); if (z == x) ...{ s.Append("abcdefghijklmnopqrstuvwxyz : "); } return s.ToString(); }
private void btn_DynStrOnce_Click(object sender, EventArgs e) ...{ System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); string a = new string('a', 1000000); sw.Start(); DynStrOnce(a); sw.Stop(); MessageBox.Show(string.Format("耗時(毫秒) : ...{0} ", sw.ElapsedMilliseconds.ToString("#,##0"))); } public string DynStrOnce(string a) ...{ if (z == x) ...{ a += "abcdefghijklmnopqrstuvwxyz"; } if (z == x) ...{ a += "abcdefghijklmnopqrstuvwxyz"; } if (z == x) ...{ a += "abcdefghijklmnopqrstuvwxyz"; } return a; }
String 動態大量字串做法 2 (1次) :
private void btn_DynStrBuOnce_Click(object sender, EventArgs e) ...{ System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); string a = new string('a', 1000000); sw.Start(); DynStrBuOnce(a); sw.Stop(); MessageBox.Show(string.Format("耗時(毫秒) : ...{0} ", sw.ElapsedMilliseconds.ToString("#,##0"))); } public string DynStrBuOnce(string a) ...{ StringBuilder s = new StringBuilder(a); if (z == x) ...{ s.Append("abcdefghijklmnopqrstuvwxyz"); } if (z == x) ...{ s.Append("abcdefghijklmnopqrstuvwxyz"); } if (z == x) ...{ s.Append("abcdefghijklmnopqrstuvwxyz"); } return s.ToString(); }
以上的所有寫法,就大概示範出在那種情況下,要用那種寫法,當字串在設計階段時就固定,那麼就用string,用+的方式來串接的效能最好,因為在Compiler後,就會將字串直接組合起來,不需要在run time再組一次,如果是在少量且資料量不大的動態字串串接時,string跟stringbuilder的差異並不大,甚至string可能還比Stringbuilder的表現還來的好,但超過一定數量後或當字串數量很大時,string就每況愈下,而Stringbuilder就漸入佳境,而Format的方式,效能並不會比直接Append來的好,所以非必要就用Append即可,當然,最後在大量動態字串串接變現最好的就是Stringbuilder.Append了,主要是因為StringBuilder會在一開始先配置較大的記憶體位置(可以自行指定Capacity,如果沒指定就採預設16),供作字串相組之用,如果不夠,才會再重新配置一塊,而String在一開始並沒有預留相組字串用的記憶體空間,所以在組字串時,每次均需重新配置記憶體位置,所以在動態組字串例如用for迴圈在組時,StringBuilder的表現會優於String. 那麼如果是SQL語法內的變數Parameters呢?例如"select * from TestTable where testid=@tid",以這個例子來說,由於變數是資料庫端在轉換使用的,並不是在程式端就把變數先轉好串接傳進去的,所以這個SQL語法的字串是固定的,並不會因為傳入的變數不同而異動到字串,也因此用string的方式就好.