En azından aşina olduğum dillerde (C, Java, C #) neden verimsiz olduğunun açıklanması doğru olsa da, büyük miktarda dize birleştirme yapmanın evrensel olarak yaygın olduğunu kabul etmiyorum. Ben üzerinde çalışmak C # kodunda, bol kullanımı vardır StringBuilder
, String.Format
aşırı yeniden tahsisini önlemek için yöntemlerle en tasarruflu tüm hafıza vardır, vb.
Sorunuzun cevabına ulaşmak için başka bir soru sormalıyız: Eğer dizeleri birleştirmek gerçekten bir sorun değilse, sınıflar neden ister StringBuilder
ve StringBuffer
var olur ? Bu tür sınıfların kullanımı neden yarı yeni başlayan programlama kitaplarına ve sınıflarına dahil edilir? Önceden olgunlaşmış optimizasyon önerileri neden bu kadar belirgindir?
Çoğu dizeyi birleştiren geliştirici, yanıtlarını tamamen deneyime dayandıracak olsaydı, çoğu bunun asla bir fark yaratmadığını ve "daha okunabilir" lehine bu tür araçların kullanılmasından vazgeçeceğini söylerdi for (int i=0; i<1000; i++) { strA += strB; }
. Ama bunu hiç ölçmediler.
Bu sorunun gerçek cevabı , bir örnekte, 50.000 dizeyi (uygulamanıza bağlı olarak yaygın bir olay olabilir) birleştirirken, küçük olanlar bile 1000x performans isabetiyle sonuçlanan bu SO cevabında bulunabilir .
Performans tam anlamıyla bir şey ifade etmiyorsa, elbette bitiştirin. Ancak alternatifleri (StringBuilder) kullanmanın zor veya daha az okunabilir olduğunu ve bu nedenle "erken optimizasyon" savunmasını başlatmaması gereken makul bir programlama uygulaması olacağını kabul etmem .
GÜNCELLEME:
Bunun ne olduğunu düşünüyorum , platformunuzu tanıyor ve ne yazık ki evrensel olmayan en iyi uygulamalarını takip ediyor . İki farklı "modern dilden" iki örnek:
- Başka bir SO yanıtında , tam ters performans özelliklerinin (array.join vs + =) bazen JavaScript'te doğru olduğu bulunmuştur . Bazı tarayıcılarda, dize birleştirme otomatik olarak optimize edilmiş gibi görünür, diğer durumlarda ise bu şekilde optimize edilmez. Yani öneri (en azından SO sorusunda), sadece bitiştirmek ve endişelenmemek.
- Başka bir durumda, bir Java derleyici olabilir otomatik gibi StringBuilder olarak daha verimli bir yapı ile birleştirme değiştirin. Ancak, diğerlerinin de belirttiği gibi, bu belirsizdir, garanti edilmez ve StringBuilder kullanmak okunabilirliğe zarar vermez. Bu özel durumda, büyük koleksiyonlar için birleştirme kullanımına veya belirsiz bir Java derleyici davranışına güvenmeye karşı önerme eğilimindeyim. Benzer şekilde, .NET'te, sıralamada hiçbir optimizasyon yapılmaz .
Her platformun her nüansını hemen bilmemek tam bir kardinal günah değildir, ancak bunun gibi önemli platform sorunlarını görmezden gelmek neredeyse Java'dan C ++ 'a geçmek ve hafızaya alma konusuna önem vermemek gibi olacaktır.