para poder amplificar los comentarios anteriores:
De su fuente, delete
() llama siempre System.arraycopy
(), pero si los argumentos son (0, count), se llamará arraycopy
() con una longitud de cero, que presumiblemente no tendrá ningún efecto. En mi humilde opinión, esto debería optimizarse ya que apuesto a que es el caso más común, pero no importa.
Con setLength
(), por el contrario, la llamada se incrementará la capacidad de la StringBuilder si es necesario a través de una llamada a ensureCapacityInternal
() (otro caso muy común que debería haber sido optimizado a cabo en mi humilde opinión) y luego se trunca la longitud que delete
() habría hecho.
En última instancia, ambos métodos simplemente terminan configurando count
a cero.
Ninguna llamada realiza ninguna iteración en este caso. Ambos hacen una llamada de función innecesaria. Sin embargo, ensureCapacityInternal() es un método privado muy simple, que invita al compilador a optimizarlo casi fuera de existencia por lo que es probable que setLength
() sea un poco más eficiente.
soy muy escéptico de que la creación de una nueva instancia de StringBuilder jamás podría ser tan eficiente como un simple ajuste de count
a cero, pero supongo que el compilador podría reconocer el patrón involucrados y convertir las repetidas instancias en las repetidas llamadas a setLength
(0). Pero en el mejor de los casos, sería un lavado. Y depende del compilador para reconocer el caso.
Resumen ejecutivo: setLength (0) es el más eficiente. Para una eficiencia máxima, preasigne el espacio de búfer en StringBuilder cuando lo cree.
¿Lo ha probado en un analizador? ¿Cuáles fueron los resultados? –
Vea también http://codereview.stackexchange.com/questions/7575/reusing-stringbuilder-or-creating-a-new-one – Flow