在.NET程序中正確使用String類型[1]
在實際程序中,String類型用得非常廣泛,然而,由于 .NET 對String類型變量的獨特管理方式,使用不當,會嚴重影響程序的 性能 。我們分幾個方面來談這個問題: 1、了解String數據的內存分配方式 編寫一個控制臺應用程序,輸入以下 測試 代碼: class Program
在實際程序中,String類型用得非常廣泛,然而,由于
.NET對String類型變量的獨特管理方式,使用不當,會嚴重影響程序的
性能。我們分幾個方面來談這個問題:
1、了解String數據的內存分配方式
編寫一個控制臺應用程序,輸入以下
測試代碼:
clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
class Program { static void Main(string[] args) { String s = "a"; s = "abcd"; } } |
使用.NET Framework 2.0 SDK提供的ildasm.exe工具查看生成的MSIL指令:
01 .method private hidebysig static void Main(string[] args) cil managed 02 { 03 .entrypoint 04 // 代碼大小 14 (0xe) 05 .maxstack 1 06 .locals init ([0] string s) 07 IL_0000: nop 08 IL_0001: ldstr "a" 09 IL_0006: stloc.0 10 IL_0007: ldstr "abcd" 11 IL_000c: stloc.0 12 IL_000d: ret 13 } // end of method Program::Main |
簡要解釋一下上述MSIL指令代碼:
第06句給局部變量s分配一個索引號(索引號從0開始,如函數中有多個局部變量,其索引號按在函數中出現的順序加一)。
在編譯時編譯器會將代碼中的兩個字串“a”和“abcd”寫入到程序集的元數據(metadata)中,此時,這兩個字串被稱為“字串字面量(string literal)”。
第08句使用ldstr指令為字串對象“a”分配內存,并將此對象引用壓入到線程堆棧中。
第09句使用stloc指令從線程堆棧頂彈出先前壓入的對象引用,將其傳給局部變量s(其索引號為0)。
同樣的過程對“abcd”重復進行一次,所以這兩句簡單的代碼
String s = "a"; s = "abcd"; |
將會導致C
LR使用ldstr指令分配兩次內存。
根據上述分析,讀者一定明白了String變量的內容是只讀的,給其賦不同的值將會導致內存的重新分配。因此,為提高程序
性能,
編程時應盡量減少內存的分配操作。
下面對代碼中常見的字串用法進行分析,從中讀者可以知道如何避免嚴重影響程序性能的字串操作。
2、盡量少使用字串加法運算符
請看以下兩段代碼:
?。?) String s1 = "ab";
s1+="cd";
?。?) String s1="ab"+"cd";
這兩段代碼運行結果一樣,但速度一樣快嗎?
請看第(1)段代碼生成的MSIL指令:
.locals init ([0] string s1) IL_0000: nop IL_0001: ldstr "ab" IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: ldstr "cd" IL_000d: call string [mscorlib]System.String::Concat(string, string) IL_0012: stloc.0 IL_0013: ret |
原文轉自:http://www.kjueaiud.com
- 評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
-