ci sono due metodi:Pattern.split più lento di 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);
}
E io testarli come questo nel metodo principale:
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);
}
Intuitivamente, penso che come String.split
finiranno per chiamare Pattern.compile.split
(dopo un sacco di lavoro extra) per fare la cosa reale. Posso costruire l'oggetto Pattern in anticipo (è thread-safe) e accelerare la divisione.
Ma il fatto è che l'utilizzo del modello precostruito è molto più lento rispetto al numero String.split
direttamente. Ho provato una stringa lunga 50 caratteri (usando MyEclipse), la chiamata diretta consuma solo metà del tempo di utilizzo di un oggetto Pattern pre-costruito.
Per favore qualcuno può dirmi perché questo succede?
dare un'occhiata alla fonte. Si chiama _ Pattern.compile (regex) .split (this, limit) ', ma solo se la stringa da dividere è più di un singolo carattere. Almeno in OpenJDK7, vedi [qui] (http://www.docjar.com/html/api/java/lang/String.java.html), riga 2312. –
@tobias_k Divertente, sei l'unico a puntare questo dettaglio cruciale ... in un commento, dove tutte le altre persone scrivono invece risposte incomplete. – GhostCat
Risposta approssimativa - http://stackoverflow.com/a/26159501/2182928 –