2012-08-02 30 views
5

Dize ve StringBuilder arasındaki performans farklarını gösteren .NET Gotchas (iyi bir okuma IMO'su) adlı bir kitap okuyorum. keçe cevapsız gidemedi! Her iki sınıfın iç yapısını bilmeme rağmen (bu sınıfların yansıyan versiyonlarına bakmadan), merak ediyordum; .NET'deki işleçler karşıdan yüklenemediğinden, Microsoft, StringBuilder'ı dahili olarak kullanmak için String sınıfını uygulamamıştır ve birleştirme işlecini yalnızca StringBuilder'da .Append() öğesini çağırmak için aşırı yüklemiş midir? Sanırım bunun neden böyle olmadığının bazı nedenleri var, ve eğer öyleyse, neden?.NET Dize birleştirmesi (+ & + =) vs. StringBuilder

cevap

6

Sorun, dizgi birleştirme işleminin yavaş olması değil, yinelenen birleştirme işleminin ayrılması gereken ve daha sonra çöp toplanması gereken bir çok ara dizge oluşturmasıdır.

DÜZENLEME mystring += "a" basit eklenti değil o
Not "a" önceki dize. Kombinasyon için yeni bir dizge oluşturur ve ona "mistring" yapar, böylece önceki değeri atar (eğer daha fazla referans yoksa).

Bir .ToString ardından StringBuilder Append olarak her bir ayrı çizgi yaparsanız

string mystring = "something"; 
mystring += "something else"; 
mystring = mystring + "third"; 

Bir dizi daha yavaş gerçekleştirecektir SON DÜZENLEME() geri dizede sonuç almak için. Tek bir StringBuilder, Append() öğesini tekrar tekrar kullanırsanız ve en sonunda bir .ToString() yaparsanız, yalnızca bir performans avantajı elde edersiniz.

StringBuilder sb = new StringBuilder(); 
sb.Append("something"); 
sb.Append("something else"); 
sb.Append("third"); 
string mystring = sb.ToString(); 

Ve sonra bir StringBuilder Katılmak dize parçaların az sayıda varsa size fayda vermez böylece kendi havai var sahiptir. derleyici tek bir açıklamada bir birleştirme uzakta optimize

Not:

string mystring = "something" + "something else" + "third"; 

hızlı olduğunu.

5

Nedeni basit:

string result = a + b; 

sadece genellikle bir döngü içinde concatenations sürü oluyor mantıklı s

var sb = new StringBuilder(a, a.Length + b.Length); 
sb.Append(b); 
string result = sb.ToString(); 

StringBuilder daha etkilidir

çünkü.