Ich habe mich dabei ertappt, dass ich das ziemlich oft gemacht habe, also habe ich einen Benchmark für die 3 wichtigsten Begrenzungstechniken für Anhänge geschrieben:
(Benchmark mit angemessener Aufwärmphase und 100 Runden mit 100.000 Iterationen)
"Anhängen nach"
static void appendAfter()
{
sb.append('{');
for (int i = 0; i < 10; i++)
{
sb.append('"');
sb.append(i);
sb.append('"');
sb.append(':');
sb.append(i);
sb.append(',');
}
sb.setLength(sb.length() - 1);
sb.append('}');
}
"Anhängen vor"
static void appendBefore()
{
sb.append('{');
String delimiter = "";
for (int i = 0; i < 10; i++)
{
sb.append(delimiter);
sb.append('"');
sb.append(i);
sb.append('"');
sb.append(':');
sb.append(i);
delimiter = ",";
}
sb.append('}');
}
"Vielleicht anhängen"
static void appendMaybe()
{
sb.append('{');
for (int i = 0; i < 10; i++)
{
sb.append('"');
sb.append(i);
sb.append('"');
sb.append(':');
sb.append(i);
if (i < 9)
{
sb.append(',');
}
}
sb.append('}');
}
Ich habe die folgenden Ergebnisse erhalten:
Plattform
Anhängen nach
Anhängen vor
Vielleicht anhängen
Windows Server 2016, Java 11 - Hotspot
26ms
40ms
26ms
Windows Server 2016, Java 8 - Hotspot
27ms
36ms
21ms
Windows Server 2016, Java 11 - OpenJ9
63ms
81ms
59ms
Windows Server 2016, Java 8 - OpenJ9
66ms
64ms
55ms
Abgesehen davon, dass sie die schnellste ist, bin ich der Meinung, dass die "Append Maybe"-Implementierung die Absicht des Codes am besten zeigt. Das ist in der Regel wichtiger als der Bruchteil der pro Iteration gewonnenen Nanosekunden.
Ich habe den Benchmark-Code aquí für den Fall, dass jemand es auf seiner Plattform ausprobieren möchte. Bitte stellen Sie Ihre Ergebnisse oben ein, wenn Sie dies tun!