2010-03-23 54 views
1

這不是過早優化本身的問題。一般來說,在垃圾收集器和內存中,幾百個操作(許多可能被複制)對程序有什麼作用,主要是關於字符串的不變性?多個.ToUpper()的影響

+0

你應該嘗試使用ToUpperInvariant()作爲ToUpper的()是文化敏感。 – ram 2010-03-23 14:39:47

回答

4

ToUpper的每個調用都將創建一個新的字符串實例,即使該內容與原始內容相同,並且即使該字符串已經作爲interned字符串文本存在。

因此,數百個ToUpper調用的影響是您創建了數百個字符串實例。如果字符串很短,這不是問題,尤其是如果您只使用字符串很短的時間。垃圾收集器可以有效處理小而短暫的對象。

例子:

// Interned string literals are the same instance: 
string a = "asdf"; 
string b = "asdf"; 
Console.WriteLine(Object.ReferenceEquals(a, b)); // True 

// ToUpper naturally creates a new instance if the content is changed: 
string c = b.ToUpper(); 
Console.WriteLine(Object.ReferenceEquals(b, c)); // False 

// ToUpper creates a new instance even if the content is unchanged: 
string d = c.ToUpper(); 
Console.WriteLine(Object.ReferenceEquals(c, d)); // False 

// ToUpper will not intern strings: 
string e = "ASDF"; 
string f = e.ToUpper(); 
Console.WriteLine(Object.ReferenceEquals(e, f)); // False 

// Dynamically created strings can be interned manually: 
string g = String.Intern(f); 
Console.WriteLine(Object.ReferenceEquals(e, g)); // True 
1

每個.ToUpper()調用都會​​創建一個新字符串。所以,額外的.ToUpper()調用絕對是低效的。嘗試儘可能減少不必要的和重複的呼叫是謹慎和專業的。

string Nacho = "cheesy" 
Nacho = Nacho.ToUpper() 
Nacho = Nacho.Trim().ToUpper() 

。 。 。創建了很多字符串垃圾。

但是,如果這段代碼不需要非常快,你不需要太偏執。雖然每個這些孤立的字符串都需要進行垃圾回收,但是這些本地小字符串幾乎總是在GC的部分集合中被拾取,並且內存很快就會返回。確保你的字符串在可能的最有限的範圍內聲明(例如,在例程內而不是在課堂級別)。

2

數百?在大多數情況下幾乎沒有什麼,假設它們不是巨大的字符串,並且你有足夠的內存。數億人可能會產生影響。

基本上每次調用都需要創建一個新的字符串(我不想認爲 .NET檢測到它已經是大寫)。

除非這是你正在做的大部分,否則我不會期望它是一個瓶頸 - 但分析將有助於驗證。