2010-03-23 90 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检测到它已经是大写)。

除非这是你正在做的大部分,否则我不会期望它是一个瓶颈 - 但分析将有助于验证。