2011-01-21 16 views
28

En clase String de Java, el recortar método contiene esto:código de operación getField

int off = offset;  /* avoid getfield opcode */ 
char[] val = value; /* avoid getfield opcode */ 

estoy un poco desconcertado por el comentario "evitar el código de operación getField" ...

Lo ¿esto significa? (Supongo que esto evita el uso de getField en el código de bytes, pero ¿por qué es esto una buena idea [TM]?)

¿Es para evitar la creación de objetos en caso de recortar no hacer nada (y por lo tanto se devuelve) o?

Respuesta

20

Mi suposición es que el punto es copiar los valores en variables locales una vez, para evitar tener que buscar el valor del campo repetidamente desde el montón para cada iteración del bucle en los próximos líneas.

Por supuesto, eso plantea la pregunta de por qué el mismo comentario no se ha aplicado en la variable local "len". (También esperaría que el JIT evite volver a buscar de todos modos, especialmente porque las variables son definitivas.)

+7

El comentario no se aplica a 'len' porque len se modifica activamente en el método, por lo que tenía que ser una variable local de todos modos. 'off' y 'val' por el contrario no se modifican, sino que existen únicamente para la optimización. – Lars

+0

@Lars: Bien manchado; No había visto el cambio a len. –

+0

@JonSkeet Si usted personalmente estaba escribiendo esta biblioteca, ¿espera que lo haya hecho? ¿O simplemente se basó en el JIT para micro-optimizar? – corsiKa

11

getfield se utiliza para obtener la variable miembro de una clase.

Como se puede ver en el código restante:

while ((st < len) && (val[off + st] <= ' ')) { 
    st++; 
} 
while ((st < len) && (val[off + len - 1] <= ' ')) { 
    len--; 
} 

Así que cuando estás en un bucle, se ha de ejecutar la getfield cada vez que se hace referencia value o offset. Puede incurrir en un gran golpe de rendimiento si el bucle se ejecuta durante un tiempo prolongado (porque cada vez que se prueba la condición de bucle, se exime getfield para offset y value). Entonces, al usar las variables locales off y val, se reduce el rendimiento alcanzado.

+0

De acuerdo, excepto que esto es válido solo para código no optimizado. Cuando JIT se involucra, ya no importa. JIT hace la optimización probablemente poniendo valor en un registro; está trivialmente permitido ya que es completamente equivalente. Con el valor siendo final, esto es obvio. Pero sería posible incluso sin eso. – maaartinus

+6

JIT * puede * optimizar esto. Por ejemplo, no espere esta optimización en Dalvik. Arrastrar un campo a un local puede ser útil por otras razones, como una comprobación nula de un campo al que se pueda acceder simultáneamente. – NateS

Cuestiones relacionadas