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
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.
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
- 1. String.Format vs "string" + "string" veya StringBuilder?
- 2. StringBuilder XmlTextWriter
- 3. Nasıl klonlanır() StringBuilder
- 4. Dize VS Byte [], bellek kullanımı
- 5. Dize enterpolasyonunu ve adlarını kullanarak .VS 2015 NET 4.5
- 6. Dizi bayt birleştirmesi sırasında ArrayStoreException
- 7. .Net Remoting vs. WCF
- 8. NET Standart Kütüphane NET Standard vs
- 9. .NET Dize Bölmesi()
- 10. SQLiteDatabase'e Kaydetme StringBuilder
- 11. CIL (MSIL) içinde Stringbuilder
- 12. StringBuilder and Builder Pattern
- 13. Kümülatif geriye dönük yuvarlanma birleştirmesi
- 14. Mülkiyet vs İşlev (özellikle .NET)
- 15. .Net Hashtable - İçerir vs ContainsKey
- 16. Dize karşılaştırması: operatör ==() vs Eşittir()
- 17. Python dize biçimlendirmesi:% vs concatenation
- 18. Dize oluşturucu ve dize birleştirme
- 19. Bir dize, .net framework 4
- 20. StringBuilder, bir satır başı ekleme ekleyemiyor mu?
- 21. Nasıl C# stringbuilder içinde her X eklenir
- 22. Aforge.NET - StringBuilder öğesinden öğe al
- 23. VS 2008, .net 3.5 proje VS 2010: türü yüklenemedi ... EntityDesignerBuildProvider
- 24. SSL sertifika doğrulama .NET vs Mono
- 25. .NET Threading Modeli ve Uygulaması.DoEvents vs. Thread.Sleep
- 26. .NET - WindowStyle = Hidden vs CreateNoWindow = true?
- 27. Neden .Net metin kutuları TextLength vs Text.Length?
- 28. PBKDF2 Python anahtarları vs .NET Rfc2898
- 29. std :: string :: uzunluğu() std vs :: dize :: boyut()
- 30. dize python içinde çalışabilir vs bul