JavaRush /Blog Java /Random-PL /String += String czy StringBuilder.append(String)?
SemperAnte
Poziom 4
Донецк

String += String czy StringBuilder.append(String)?

Opublikowano w grupie Random-PL
W tym artykule chciałbym rozważyć, przeanalizować, opowiedzieć i pokazać, jaka jest różnica pomiędzy metodą dołączania z klasy StringBuildera operatorem +=dla String. Tutaj pytanie będzie dotyczyć nie tyle obszarów zastosowań, ile optymalizacji kodu.
String += String czy StringBuilder.append(String)?  - 1
Tak, osoba, która niewątpliwie nie wgłębiła się w to pytanie, powie: „Dlaczego mam zastąpić operator += tworząc nowy obiekt zupełnie innej klasy, a potem jeszcze wywołać metodę toString()? Jaką mamy optymalność o czym mówisz? Wybór jest oczywisty, o czym mówisz?” i byłby całkowicie w błędzie. Jednym z problemów jest to, że Stringnie jest on prymitywny. String- obiekt jak każdy inny classw Javie, a jak wiadomo, w Javie nie ma czegoś takiego jak przeciążanie operatora (jak na przykład w C++), operatory są definiowane tylko dla prymitywów, a dla żadnej klasy nie możemy przesłonić żadnego operatora. Dlatego operatory " +" i " += " są swego rodzaju „podporą” biblioteki Java, a podporą zawsze są straty. Właściwie przestańmy ciągnąć kota za ogon i przejdźmy do pomiarów. Oto prosty program, który mierzy czas potrzebny na „sklejenie” linii ze zmienną pętlą 100 000 razy.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Cześć";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Na moim komputerze w konsoli wyświetliło się 6815ms. Oznacza to, że zszycie tej linii zajęło mojemu komputerowi prawie 7 sekund. Teraz zastąpmy go StringBuilderem, a nawet uwzględnijmy metodę toString()w pomiarach.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Cześć");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Mój komputer powiedział mi 10 ms. Oznacza to, że 0,01 sekundy. Myślę, że różnica w praktyce jest dość oczywista, z grubsza rzecz biorąc, zadziałało 700 razy appendszybciej. Wynika to z faktu, że najprawdopodobniej „ +” i „ +=” same w sobie mogą nazwać to samo dołączeniem, ale jednocześnie przeszły długą drogę przez kule języka, aby zrozumieć, że taki operator w ogóle istnieje i co to jest powinienem zrobić (ostatni akapit to nic innego jak przypuszczenie, nie jestem programistą JVM i nie wiem, co tam jest i jak). To wyraźny przykład na to, że dodatkowy przedmiot nie zawsze jest kosztowny. Tak, kod wydłuży się o kilka linii, ale oszczędność czasu w dużych projektach może być kolosalna. Należy pamiętać, że pomiarów nie robiono na komputerze biurowym z prehistorycznym procesorem, ale teraz wyobraźcie sobie, jaką różnicę zrobi to na tym właśnie biurowym komputerze, który z trudem pociąga za szalik.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION