Daniel Thoma: Vergleiche von char-Variabeln

Beitrag lesen

Hallo Cheatah,

wenn Du "minimal" durch "spürbar" ersetzt, stimme ich Dir zu.

Ich habe das jetzt mal ausprobiert und zu meiner überraschung festgestellt, dass Du ausgerechnet bei kurzen, aber nicht bei längeren Strings recht hast.

Beispiel:

import java.util.regex.*;

import java.util.regex.*;

public class test {
  public static void main(String[] args) {
    String test = "qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz a qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz";
    int limit = 1000000;
    long time = System.currentTimeMillis();
    char c;
    for(int a = 0; a < limit; ++a) {
      for(int b = 0; b < test.length(); ++b) {
        c = test.charAt(b);
        if(c == 'a' || c == 'b') {
          break;
        }
      }
    }
    System.out.println(System.currentTimeMillis() - time);
    time = System.currentTimeMillis();
    Pattern pattern = Pattern.compile("a|b");
    for(int a = 0; a < limit; ++a) {
      if(pattern.matcher(test).matches()) {

}
    }
    System.out.println(System.currentTimeMillis() - time);
  }
}

Die Variante mit vorkompiliertem RegExp ist doppelt so schnell, wie die Variante mit Schleife. Die RegExp Variante lässt sich sogar noch weiter optimieren, indem man nicht jedes mal einen neuen Matcher erzeugt. Das war aber so schnell, dass ich mir nicht sicher war, ob das Ergebniss nicht gecacht wird.

Wenn man einen String nimmt, der sehr kurz ist (10 Zeichen oder so) ist die Schleifenvariante allerdings deutlich schneller.

Vermutlich gibt es eine Möglichkeit die Zeichen schneller hintereinander zu verarbeiten als mit dem Zugriff per charAt().

Grüße

Daniel