İçeriği atlamak için "Enter"'a basın

Effective Java Madde 63: String Birleştirme Yaparken Performans Kayıplarına Dikkat Edin

Last updated on Ağustos 2, 2022

String birleştirme operatörünü (+) kullanarak birden çok string değerini tek bir string olarak kolayca birleştirmemiz mümkündür. Bu yöntem eğer tek satırlık bir çıktı oluşturmak istiyorsanız veya küçük bir nesneyi string formatında ifade etmek istiyorsanız işinizi görebilir, ancak daha büyük işlerde sınıfta kalır. Bunun sebebi ise Madde 17’de gördüğümüz gibi stringlerin değiştirilemez (immutable) olmasıdır. İki stringi birleştirdiğinizde her ikisinin de kopyalanması gerekir.

Örneğin, bir dokümanı oluşturmak için her bir satırı + operatörü ile birleştiren bir metot yazdığımızı düşünelim:

// Yanlış string birleştirme kullanımı - düşük performans
public String statement() {
    String result = "";
    for (int i = 0; i < numItems(); i++)
        result += lineForItem(i);     // String birleştirme
    return result;
}

Eğer bu metodu kullanarak işlediğiniz satır sayısı çok fazla olursa performans çok düşük olacaktır. Bunu düzeltmek için String yerine StringBuilder kullanmalıyız. Aşağıdaki koda bakalım:

public String statement() {
    StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
    for (int i = 0; i < numItems(); i++)
        b.append(lineForItem(i));
    return b.toString();
}

String birleştirme işlemini hızlandırmak için Java 6’dan beri çok sayıda iyileştirme yapılmasına rağmen hala aradaki performans farkı çok büyüktür. Benim makinamda, numItems değerinin 100 olduğu ve lineForItem metodunun 80 karakterli bir string döndürdüğü durumda, ikinci metot birinciden 6.5 kat daha hızlı çalışmaktadır. Bunun sebebi birinci metodun eleman sayısı olarak n2, ikincininse n karmaşıklığa sahip olmasıdır. Bu farktan dolayı, eleman sayısı büyüdükçe aradaki performans farkı da katlanacaktır. Dikkat ettiyseniz ikinci metotta StringBuilder yaratılırken gerekli olan bütün belleği önceden ayırması için boyut bilgisi geçilmiştir. Bu bilgi mevcut değilse, varsayılan boyutta bir StringBuilder yaratsak bile yine de birinci metottan 5.5 kat hızlı çalışmaktadır.

Buradaki ders çok açıktır. String birleştirme operatörünü en fazla birkaç tane stringi birleştirmek için kullanın. Kod performansı önemliyse, bunun yerine StringBuilder.append() metodunu kullanın. Bunun yerine karakter dizisi (char array) de kullanabilir veya stringleri birleştirmek yerine tek tek işleyebilirsiniz.

Share

Bir Cevap Yazın

%d blogcu bunu beğendi: