java - ¿Cuándo JVM usará intrínsecos?
performance intrinsics (2)
Por qué ciertos patrones de código cuando están presentes dentro de JVM las clases internas se convierten en una función intrínseca, mientras que los mismos patrones cuando son llamados desde mi propia clase no lo son
Ejemplo:
La función bitCount, cuando se llama desde Integer.bitCount (i) se convertirá en un intrínseco. Pero cuando se copia en mi clase y luego se llama, la ejecución demorará mucho más.
Comparar
Integer.bitCount(i)
MyClass.bitCount(i)
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
La JVM tiene una lista de métodos, generalmente nativos, que se reemplaza con el código de máquina en línea. Esta lista aparece en el archivo de encabezado intrínseco en OpenJDK, aunque no puedo encontrar un enlace en la web.
Consulte desde la línea 581 en el enlace @Jack proporcionado vmSymbols.hpp
La respuesta es simple: una función intrínseca se define de esta manera porque existe una forma más rápida y nativa de obtener el resultado de la función y se aplica en el caso gracias a una asignación específica.
Eso no es algo relacionado con la compilación en absoluto. Integer.bitCount
es especial en el sentido de que la implementación está marcada como reemplazable por una instrucción POPCNT asm POPCNT . Básicamente, esta instrucción nativa se usa cuando se usa la función Integer.bitCount
(si la CPU admite esa instrucción), cuando declara su propia copia de la función, se usa la implementación normal.
¿Por qué JVM es capaz de reconocer que la función se puede optimizar? Debido a que está codificado en somewhere del JDK, eso no tiene nada que ver con la similitud con el código.