-Es wird gesagt, dass die Klassen StringBuilder und StringBuffer verwendet werden sollten, da dies ein Overhead ist.
・ Ich benutze diese Klassen nicht und sage: "So viel Aufwand ist keine große Sache." Natürlich sollten Sie es verwenden, wenn Sie viel Zeit haben, aber (für mich) gibt es nicht viele solcher Situationen.
-Wenn Sie diese Klassen verwenden, ist es ein kleines Problem, dass der Quellcode schwer zu erkennen ist.
・ Ich habe gemessen, wie sehr es anders war.
-Bitte verwenden Sie es zur Beurteilung, wenn Sie StringBuffer (StringBuilder) verwenden.
-Wenn es 1 Million Mal erreicht, ist StringBuffer schneller als StringBuilder. Der Grund ist (mir) unbekannt.
・ Hier wird das Ergebnis einmal angezeigt, aber die Tendenz ist dieselbe, egal wie oft es durchgeführt wird.
-Differenz zwischen StringBuffer und StringBuilder. Ersteres ist threadsicher und letzteres nicht. Letzteres ist neu.
・ Der Grund, warum ich es nicht threadsicher gemacht habe, ist, dass es selten in Threads verwendet wird und ich deshalb nicht langsamer werden möchte (Stellen Sie sich vor).
-Wenn Sie StringBuilder in einem Thread verwenden möchten, sollten Sie ihn selbst steuern.
Tips0016.java
package jp.avaj.lib.algo;
import java.util.Date;
import jp.avaj.lib.test.L;
class Tips0016 {
private static int CNT0;
private static final int CNT1 = 100; //
public static void main(String[] args) {
L.p("====10.000 Mal");
CNT0 = 10000;
execString();
execStringBuilder();
execStringBuffer();
L.p("====100.000 Mal");
CNT0 = 100000;
execString();
execStringBuilder();
execStringBuffer();
L.p("====Millionenfach");
CNT0 = 1000000;
execString();
execStringBuilder();
execStringBuffer();
}
private static void execString() {
long start = (new Date()).getTime();
for (int i=0; i<CNT0; i++) {
String s = "";
for (int j=0; j<CNT1; j++) {
s += "aaa";
}
}
long end = (new Date()).getTime();
diff("String",start,end);
}
private static void execStringBuilder() {
long start = (new Date()).getTime();
for (int i=0; i<CNT0; i++) {
StringBuilder sb = new StringBuilder();
for (int j=0; j<CNT1; j++) {
sb.append("aaa");
}
}
long end = (new Date()).getTime();
diff("StringBuilder",start,end);
}
private static void execStringBuffer() {
long start = (new Date()).getTime();
for (int i=0; i<CNT0; i++) {
StringBuffer sb = new StringBuffer();
for (int j=0; j<CNT1; j++) {
sb.append("aaa");
}
}
long end = (new Date()).getTime();
diff("StringBuffer",start,end);
}
private static void diff(String desc,long start,long end) {
L.p(desc+"="+(end-start));
}
}
Das Ausführungsergebnis ist wie folgt.
Tips0016.txt
====10.000 Mal
String=230
StringBuilder=31
StringBuffer=52
====100.000 Mal
String=1383
StringBuilder=149
StringBuffer=352
====Millionenfach
String=12336
StringBuilder=1433
StringBuffer=1388