在實際程序中
String類型用得非常廣泛
然而
由於
NET對String類型變量的獨特管理方式
使用不當
會嚴重影響程序的性能
我們分幾個方面來談這個問題
了解String數據的內存分配方式
編寫一個控制台應用程序
輸入以下測試代碼
class Program
{
static void Main(string[] args)
{
String s =
a
;
s =
abcd
;
}
}
使用
NET Framework
SDK提供的ildasm
exe工具查看生成的MSIL指令
method private hidebysig static void Main(string[] args) cil managed
{
entrypoint
// 代碼大小
(
xe)
maxstack
locals init ([
] string s)
IL_
: nop
IL_
: ldstr
a
IL_
: stloc
IL_
: ldstr
abcd
IL_
c: stloc
IL_
d: ret
} // end of method Program::Main
簡要解釋一下上述MSIL指令代碼
第
句給局部變量s分配一個索引號(索引號從
開始
如函數中有多個局部變量
其索引號按在函數中出現的順序加一)
在編譯時編譯器會將代碼中的兩個字串
a
和
abcd
寫入到程序集的元數據(metadata)中
此時
這兩個字串被稱為
字串字面量(string literal)
第
句使用ldstr指令為字串對象
a
分配內存
並將此對象引用壓入到線程堆棧中
第
句使用stloc指令從線程堆棧頂彈出先前壓入的對象引用
將其傳給局部變量s(其索引號為
)
同樣的過程對
abcd
重復進行一次
所以這兩句簡單的代碼
String s =
a
;
s =
abcd
;
將會導致CLR使用ldstr指令分配兩次內存
根據上述分析
讀者一定明白了String變量的內容是只讀的
給其賦不同的值將會導致內存的重新分配
因此
為提高程序性能
編程時應盡量減少內存的分配操作
下面對代碼中常見的字串用法進行分析
從中讀者可以知道如何避免嚴重影響程序性能的字串操作
盡量少使用字串加法運算符
請看以下兩段代碼
(
) String s
=
ab
;
s
+=
cd
;
(
) String s
=
ab
+
cd
這兩段代碼運行結果一樣
但速度一樣快嗎?
請看第(
)段代碼生成的MSIL指令
locals init ([
] string s
)
IL_
: nop
IL_
: ldstr
ab
IL_
: stloc
IL_
: ldloc
IL_
: ldstr
cd
IL_
d: call string [mscorlib]System
String::Concat(string
string)
IL_
: stloc
IL_
: ret
[] []
From:http://tw.wingwit.com/Article/program/net/201311/15505.html