W tym artykule chciałbym rozważyć, przeanalizować, opowiedzieć i pokazać, jaka jest różnica pomiędzy metodą dołączania z klasy
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ę
StringBuilder
a operatorem +=
dla String
. Tutaj pytanie będzie dotyczyć nie tyle obszarów zastosowań, ile optymalizacji kodu.
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 String
nie jest on prymitywny. String
- obiekt jak każdy inny class
w 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 append
szybciej. 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.
GO TO FULL VERSION