Ne zaman StringBuilder veya StringBuffer kullanmalıyım?


13

Bir üretim web uygulamasında, program arkadaşlarım her yerde StringBuffer kullandılar. Şimdi uygulama geliştirme ve düzeltmelerle ilgileniyorum. StringBuilder ve StringBuffer'ı okuduktan sonra , veri çekirdeklerimizde iş parçacığı güvenliğine ihtiyaç duymadığımız için tüm StringBuffer kodunu StringBuilder ile değiştirmeye karar verdim.

Örneğin: (Her veri çekirdeğinde StringBuffer'ın kullanımını görebilirim)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

Her oturum / istek için ayrı bir veri çekirdekleri oluştururuz. Bir oturum tek bir kullanıcı tarafından kullanılır ve başka hiçbir kullanıcı oturum açamaz.

Göç etmeden önce başka noktaları düşünmeli miyim?

Tek bir iş parçacığı varsa (bekleyen iş parçacığı yok / yeni iş parçacığı nesne kilidi aramayacaksa), StringBuffer veya StringBuilder ile eşit olarak çalışır. StringBuffer durumunda, nesne kilidi almak için zaman alır ama nesne kilidi tutma / serbest bırakma dışında herhangi bir performans farkı olup olmadığını bilmek istiyorum.


9
Örneğinizde sbolduğu gibi yerel bir değişken olarak kullanırsanız , iplik güvenliği hiç de önemli değildir. Yönteme aynı anda bin iş parçacığı girse bile, her birinin kendi yerel değişkenleri ile kendi çağrı yığını olacaktır. StringBuilders asla birbirlerini etkilemez.
fredoverflow

Ben her zaman kim bir dizi arayüzü gibi bir şey boyunca iki iş parçacığı senkronize etmek istediğini merak ettim StringBuffer. Ben hiç böyle kod görmedim ama neredeyse çok iş parçacığı bakış açısından kötü bir tasarım eminim. Ben StringBufferarayüzü boyunca iplik senkronize kötü bir fikir olduğunu düşünüyorum çünkü bu sınıf olmamalı ve her zaman kullanmak gerektiğini düşünüyorum StringBuilder. Diğerlerinin de belirttiği gibi, StringBuffertarihsel nedenlerden dolayı var.
pasztorpisti

Yanıtlar:


22

İkisi arasındaki tek fark StringBuffer'da kullanılan senkronizasyondur. Eşitleme yükü, şeylerin genel şemasında çok büyük değildir, ancak bunlara sahip olmayan StringBuilder yöntemlerine göre önemlidir. JVM, özellikle tek bir iş parçacığı vb.İle yapmak zorunda kalmayacağı işleri yapıyor.

Kodunuz çalışırsa ve insanlar performanstan şikayet etmiyorsa, endişelenmezdim. Paran için çok fazla patlama yapmayacaksın. Ancak, yeni kod yazıyorsanız veya StringBuffer kullanan kodu güncelleştiriyorsanız, ben bunları aynı zamanda StringBuilder dönüştürmek öneririz.


Buna, ikisinin devasa iplik güvenliğini aklınızda bulundurmanız gerektiğini ekleyeceğim. StringBuilder iş parçacığı için güvenli değildir.
Martijn Verburg

2
@MartijnVerburg Doğru, stackoverflow.com/questions/6775016/stringbuffer-is-obsolete/… ' de belirtilmiş olmasına rağmen, bir String oluşturucusunun aynı örneğini kullanması için birden fazla iş parçacığı gerektiren çok az kullanım durumu olduğu belirtilmiştir .
Matthew Flynn

4
@MartijnVerburg: o da belirtmek gerekir: eğer sen gerçekten o iplik güvenlik gereksinim ihtimali o kadar artar vardır StringBufferya yeterli değildir! Frenlenmediğini garanti eder, ancak birden fazla iş parçacığı aynı anda erişirse eklediğiniz konum kolayca kontrol edilemez, bu nedenle başka bir harici senkronizasyon gerekli olacaktır.
Joachim Sauer

8

StringBuilder daha iyi ve daha hızlı bir StringBuffer olmak için bir noktaya (Java 1.5) eklendi ve derleyici +operatörü Dizeler üzerinde uygulamak için başlık altında kullanır .

Bu, StringBuilder kullanarak kodunuzu sınıf tanıtıldığından daha eski olan JVM'lerde çalıştıramayacağınız anlamına gelir. Bu bir süredir bizim için bir sorun olacaktı. Her zaman en son sürümü çalıştırırsanız, ilgilenmenize gerek yoktur.

Aşağıdaki nedenlerle olsa da, geçtiğiniz optimizasyon sürecinden geçmem.

  • Sıkı döngüler dışında avantaj göz ardı edilebilir. Açık bir şekilde bir profil oluşturucuda sıcak nokta olarak görünmedikçe, rahatsız olmazdım.
  • Kodun değiştirilmesi hatalara neden olabilir ve uygulamanızı yeniden test etmeniz gerekir. Senkronize olmayan bir ortamda senkronize bir sınıfla yaşamaktan çok daha pahalı olabilir.

Sana katılıyorum .. hala ne anlama geldiğini anlayamıyorumOutside tight loops the advantage is negligible...
Satish Pandey

StringBuilder'da StringBuffer'ın aksine eksik olan mekanizma, iş parçacığı güvenliği için işlem hızıdır. Bu hız iyileştirme çok küçüktür, bu yüzden sadece çok kez yapılırsa önemlidir - bu genellikle küçük bir döngüde birçok kez yapılır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.