Tak więc byłem lead to believe, który używając operatora "+" do dołączenia Strings na jednej linii był tak samo wydajny jak użycie StringBuilder (i zdecydowanie o wiele ładniej na oczach). Dzisiaj jednak miałem problemy z szybkością z Loggerem, który dołączał zmienne i łańcuchy, korzystał z operatora "+". Zrobiłem więc szybki test case i ku mojemu zdziwieniu odkryłem, że używanie StringBuilder było szybsze!Różnica prędkości dla pojedynczej linii Łączenie ciągów znaków
Podstawy są używane średnio 20 przebiegów dla każdej liczby załączeń, z 4 różnymi metodami (pokazane poniżej).
wyników, czasu (w sekundach),
# of Appends 10^1 10^2 10^3 10^4 10^5 10^6 10^7 StringBuilder(capacity) 0.65 1.25 2 11.7 117.65 1213.25 11570 StringBuilder() 0.7 1.2 2.4 12.15 122 1253.7 12274.6 "+" operator 0.75 0.95 2.35 12.35 127.2 1276.5 12483.4 String.format 4.25 13.1 13.25 71.45 730.6 7217.15 -
Wykres procentowego Różnica z najszybszych algorytmu.
Mam wyrejestrowany byte code, jest inny dla każdej metody porównywania znaków.
Oto, czego używam do metod, i można zobaczyć całą klasę testową here.
public static String stringSpeed1(float a, float b, float c, float x, float y, float z){
StringBuilder sb = new StringBuilder(72).append("[").append(a).append(",").append(b).append(",").append(c).append("][").
append(x).append(",").append(y).append(",").append(z).append("]");
return sb.toString();
}
public static String stringSpeed2(float a, float b, float c, float x, float y, float z){
StringBuilder sb = new StringBuilder().append("[").append(a).append(",").append(b).append(",").append(c).append("][").
append(x).append(",").append(y).append(",").append(z).append("]");
return sb.toString();
}
public static String stringSpeed3(float a, float b, float c, float x, float y, float z){
return "["+a+","+b+","+c+"]["+x+","+y+","+z+"]";
}
public static String stringSpeed4(float a, float b, float c, float x, float y, float z){
return String.format("[%f,%f,%f][%f,%f,%f]", a,b,c,x,y,z);
}
Próbowałem teraz z floats, ints i stringami. Wszystkie wykazują mniej więcej taką samą różnicę czasu.
Pytania
- Operator „+” nie jest wyraźnie coraz tego samego kodu bajtowego, a czas jest bardzo różni się od optymalnego. Co daje?
- Zachowanie się algorytmów między 100 a 10000 liczbą załączeń jest dla mnie bardzo dziwne, więc czy ktoś ma jakieś wyjaśnienie?
Zachowanie algorytmów betwen 100 i .... ??? – ChrisCM
naprawiono, z jakiegoś powodu zostało przerwane. – greedybuddha
Świetne pytanie, z badaniami i danymi, aby je utworzyć. +1 – syb0rg