Es gibt zwei Methoden:Pattern.split langsamer als String.split
private static void normalSplit(String base){
base.split("\\.");
}
private static final Pattern p = Pattern.compile("\\.");
private static void patternSplit(String base){
//use the static field above
p.split(base);
}
Und ich sie so im Hauptverfahren testen:
public static void main(String[] args) throws Exception{
long start = System.currentTimeMillis();
String longstr = "a.b.c.d.e.f.g.h.i.j";//use any long string you like
for(int i=0;i<300000;i++){
normalSplit(longstr);//switch to patternSplit to see the difference
}
System.out.println((System.currentTimeMillis()-start)/1000.0);
}
Intuitiv, denke ich als String.split
schließlich rufen Pattern.compile.split
(nach viel mehr Arbeit), um das echte Ding zu tun. Ich kann das Musterobjekt im Voraus konstruieren (es ist threadsicher) und die Aufteilung beschleunigen.
Aber die Tatsache ist, mit dem vorkonstruierten Muster ist viel langsamer als Aufruf String.split
direkt. Ich habe eine 50 Zeichen lange Zeichenfolge auf ihnen versucht (mit MyEclipse), der direkte Aufruf verbraucht nur die Hälfte der Zeit der Verwendung vor-konstruierten Musterobjekt.
Bitte kann mir jemand sagen, warum das passiert?
an der Quelle einen Blick. Es ruft 'Pattern.compile (regex) .split (this, limit)' auf, jedoch nur, wenn die zu teilende Zeichenfolge mehr als ein einzelnes Zeichen ist. Zumindest in OpenJDK7, siehe [hier] (http://www.docjar.com/html/api/java/lang/String.java.html), Zeile 2312. –
@tobias_k Lustig, du bist der Einzige, der darauf verweist aus diesem entscheidenden Detail ... in einem Kommentar, wo alle anderen Leute unvollständige Antworten schreiben. – GhostCat
Lose verwandte Antwort - http://stackoverflow.com/a/26159501/2182928 –