Tengo una clase que está haciendo un montón de procesamiento de texto. Para cada cadena, que tiene entre 100 y> 2000 caracteres de longitud, estoy realizando 30 reemplazos de cadena diferentes.Java's String.replace() vs. String.replaceFirst() vs. homebrew
Ejemplo:
string modified;
for(int i = 0; i < num_strings; i++){
modified = runReplacements(strs[i]);
//do stuff
}
public runReplacements(String str){
str = str.replace("foo","bar");
str = str.replace("baz","beef");
....
return str;
}
'foo', 'baz', y todos los demás "blancos", sólo se espera que aparezcan una vez y son literales de cadena (sin necesidad de una expresión regular real).
Como se puede imaginar, estoy preocupado por el rendimiento :)
Ante esto,
replaceFirst()
parece una mala opción, ya que no utilizaráPattern.LITERAL
y hará procesamiento adicional que ISN' t requerido.replace()
parece una mala elección, ya que recorrerá toda la cadena en busca de múltiples instancias para ser reemplazados.
Además, dado que mis textos de reemplazo son los mismos cada vez, parece que tiene sentido para mí escribir mi propio código de otro modo String.replaceFirst()
o String.replace()
a estar haciendo un Pattern.compile
cada vez en el fondo. Pensando que debería escribir mi propio código, este es mi pensamiento:
Realice una
Pattern.compile()
sola vez para cada sustitución literal deseada (sin necesidad de volver a compilar cada vez) (es decir, P1 - P30)a continuación, haga lo siguiente para cada pX:
p1.matcher(str).replaceFirst(Matcher.quoteReplacement("desiredReplacement"));
esta manera que abandonar el barco en la primera sustitución (en lugar de atravesar toda la cadena), y estoy usando literal frente a regex, y no estoy haciendo una nueva compilación en cada iteración.
Entonces, ¿cuál es el mejor rendimiento?
Maldita sea, pásamela. @jonathon, no tienes un problema de rendimiento hasta que sabes que tienes un problema de rendimiento. – dty
y medirlo en el contexto de su aplicación haciendo lo que se supone que debe hacer, puede parecer mucho trabajo, pero podría perderse fácilmente en el ruido de las llamadas a cualquier tráfico de red. –