[ASP.NET] ToString() ? Boxing ?
當我們在程式中利用for loop來做一些事情時,有時會見到類似以下的Code
string result = string.Empty;
for (int i = 0; i < 100000; i++)
{
result += i; //把i拿來做字串組合,做其它事情
}
在類似的程式中,int i被拿來做字串組合,然後做其它事情,例如:抓取具有
ID值具有固定命名規則的控制項,像是ID= xxx1 ~ xxx100。但是同時我們也
可能看到以下的寫法
string result = string.Empty;
for (int i = 0; i < 100000; i++)
{
result += i.ToString(); //把i拿來做字串組合,做其它事情
}
二者的差別只在於有沒有ToString(),就功能上來說二個寫法都可以順利執行
,既然都可以順利執行,那麼有沒有ToString()有差嗎?
從效能上來看答案是肯定的,在程式寫作上我們都應該避免不必要的Boxing
和 Unboxing ,在第一個寫法上基本上我們可以合理的懷疑程式在run的過程
中是做了Boxing,為了證實這點我們藉由il檔來實際看看,果不其然是有Boxing
的過程,而第二種寫法則沒有Boxing的過程(如下圖所示)
此時或許您會質疑,說不定System.Int32的ToString()Method裡也是Boxing啊
然而關於這點我們可以從文件上來證明,在『Object.ToString 方法』文件有提到
『ToString 是 .NET Framework 中主要的格式化方法。 它會將物件轉換為其字串
表示形式,使它適合於顯示。』
『型別通常會覆寫 ToString 方法,以傳回表示物件執行個體的字串。 例如,基底
型別 (例如,Char、Int32 和 String) 會提供 ToString 實作,傳回物件表示之值的
字串格式。 下列範例會定義 Object2 類別,這個類別覆寫 ToString 方法以傳回型
別名稱與其值。』,也就是通常在型別中會對ToString()覆寫,回傳其Value。
此外做了點簡單測試,分別以二種寫法進行10000次的實測,看看其花費的時間成本
結論:
雖然實測差距並沒有很大,不過既然明確知道第一種寫法會有Boxing的情況發生,建議也
就盡量避免吧,多打個ToString()不會花費多少的coding時間,但卻可以減少一個影響
效能因子,何樂而不為呢!
PS:例子可能舉的不太好,對於字串相加的寫法效能問題,不在本議題中 XD (感謝91的提醒,呵)
Ref:
By No.18