[JAVA] Geschwindigkeitsvergleichstest für String, StringBuilder, StringBuffer

-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

Recommended Posts

Geschwindigkeitsvergleichstest für String, StringBuilder, StringBuffer
[Java] Vergleich der Ausführungsgeschwindigkeit des String-Joins (+ Operator vs StringBuilder)
MyBatis-Zeichenfolgenvergleich
String und Stringbuffer und String Builder
Java - StringBuilder vs StringBuffer