Java'da "+" operatörü ile StringBuilder kullanımı arasında bir performans farkı var mı?


cevap 1:

Java'da "+" operatörü ile StringBuilder kullanımı arasında bir performans farkı var mı?

Bunlar gibi tek bir satırda:

String string1 = “bir” + “iki”;
String string2 = yeni StringBuilder (“one”). Append (“two”). ToString ();

Performansta hiçbir fark olmamalıdır. Aslında, modern Java ekosistemlerinde, birincisi derleme zamanında ikincisine optimize edilmiştir. Bunu çalışırken görmek için, en sevdiğiniz hata ayıklayıcıyı kullanarak ilkine geçmeyi deneyin.

Ancak, birleştirme dizeleri ayrı satırlarda veya diyelim ki bir for döngüsünde:

String string1 = “”;
StringBuilder sb = new StringBuilder ();

for (Tamsayı i = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append () (i.toString);
}

Dize string2 = sb.toString ();

Sonra bir StringBuilder kullanmak daha "verimli" ve bazen daha karmaşık bir dize oluşturmak için tercih edilen yoludur. Bildiğim kadarıyla, şu anda hiçbir Java derleyicisi yinelenen + 'leri StringBuilder'a optimize etmeyecektir.


cevap 2:

Kısa cevap: olabilir, ancak çoğu zaman endişelenmeye değmez. Erken optimizasyon yerine açık kod tercih edin.

Modern JVM'ler Dize birleştirmesini "+" ile optimize edebilir ve bir StringBuilder'a dönüştürebilir ve sonuçta elde edilen Dize'nin ne kadar süreceğini görebildikleri için, başlangıçta StringBuilder'e doğru boyutu ayırabilirler. Varsayılan dizi boyutunu kullanarak kendiniz bir StringBuilder oluşturursanız, char dizisinin daha sonra genişletilmesi gerekebilir, bu da dizi kopyasını içerir, bu nedenle aslında daha yavaş olabilir.

Java 9'dan bu yana, String birleştirmesi çalışma zamanında kararlaştırılan bir stratejiyle çok daha optimize edilmiştir.

Bir dizede art arda bir Dize ekliyorsanız, muhtemelen bir StringBuilder kullanarak yanlış gidemezsiniz, ancak biliniyorsa doğru boyutu önceden ayırırsınız. Döngülerin dışında, daha okunabilir olduğunda "+" ile yapıştırın; ve JVM'nin optimizasyonda sizden daha iyi olduğuna veya yakında olacağına güvenin.