studio setadapter llenar ejemplo custom arrayadapter android performance string listview format

setadapter - ¿Por qué es lento el perro String.format de Android?



listview setadapter (3)

Estoy atónito.

¿Por qué?

¿Por qué es este último más rápido que llamar a String.format?

Porque está escrito en Java. %02d: %dx%d no es Java. Eso tiene que ser analizado cada vez y las reglas ejecutadas todo el tiempo. Esas reglas se ejecutan en Java, a través de java.util.Formatter .

Ahora, String.format() podría optimizarse reemplazándolo con una implementación de código nativo (C / C ++), pero creo que varargs y JNI se vuelven complicados.

Me gustaría esperar que la concatenación de objetos genere más objetos intermedios y, en general, el rendimiento de la papelera, pero he encontrado exactamente lo contrario. De hecho, cuando se ejecutaba con String.format recibía muchos mensajes de asignación / desasignación de la vm.

Eso sería porque String.format() es bastante complejo y se implementa en Java.

Estaba implementando una actividad ListView con vistas dibujadas personalizadas y tenía el siguiente código:

@Override public void onDraw(Canvas canvas) { super.onDraw(canvas); .... canvas.drawText(String.format("%02d: %dx%d", position, w, h), 10, 15, cached_paint); }

Prácticamente nada más en el método onDraw, así que esto me estaba volviendo loco sobre por qué el desplazamiento era tan pobre. Por casualidad cambié el parámetro drawText para no usar String.format y de repente el desplazamiento fue seda de nuevo. De hecho, el siguiente es prácticamente el mismo pero funciona bien:

canvas.drawText("" + position + ": " + w + "x" + h, 10, 15, cached_paint);

Estoy atónito. ¿Por qué es este último más rápido que llamar a String.format? Me gustaría esperar que la concatenación de objetos genere más objetos intermedios y, en general, el rendimiento de la papelera, pero he encontrado exactamente lo contrario. De hecho, cuando se ejecutaba con String.format recibía muchos mensajes de asignación / desasignación de la vm.

Entonces, ¿por qué String.format es tan lento cuando aparentemente podría ser más rápido (al menos cuando proviene de otros lenguajes de programación donde la creación de objetos es costosa)?


La concatenación de cadenas con + no genera muchos objetos intermedios; básicamente un StringBuffer y su matriz de caracteres interna (que podría reasignarse si se queda sin capacidad). Ah, y la cadena cuando es a través de la concatenación.

Además, con + , la mayor parte del trabajo de análisis de los tipos de datos de los objetos que entran en la cadena se realiza en tiempo de compilación. Con String.format, eso se hace en tiempo de ejecución. Para colmo, cada tipo primitivo que pases a String.format necesita ser autoboxado, lo que genera muchos más objetos.


Para obtener el mejor rendimiento, puede crear un formateador a partir del paquete java.text y almacenarlo en caché.

final static DecimalFormat myFormat = new DecimalFormat("###"); @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); .... canvas.drawText(myFormat.format(w) + "x" + myFormat(h)); }

Para un mejor rendimiento, puede utilizar una concatenación de cadenas más rápida. Pero ese es un tipo diferente de optimización, y fuera de tema para esta pregunta.