Estoy tratando de obtener el mayor rendimiento posible de algún método interno.
El código de Java es:
List<DirectoryTaxonomyWriter> writers = Lists.newArrayList();
private final int taxos = 4;
[...]
@Override
public int getParent(final int globalOrdinal) throws IOException {
final int bin = globalOrdinal % this.taxos;
final int ordinalInBin = globalOrdinal / this.taxos;
return this.writers.get(bin).getParent(ordinalInBin) * this.taxos + bin; //global parent
}
En mi generador de perfiles vi que hay un 1% de gasto de CPU java.util.Objects.requireNonNull, pero ni siquiera lo llamo. Al inspeccionar el código de bytes, vi esto:
public getParent(I)I throws java/io/IOException
L0
LINENUMBER 70 L0
ILOAD 1
ALOAD 0
INVOKESTATIC java/util/Objects.requireNonNull (Ljava/lang/Object;)Ljava/lang/Object;
POP
BIPUSH 8
IREM
ISTORE 2
Entonces el compilador genera esta verificación (¿inútil?). Trabajo en primitivas, que no pueden ser de nulltodos modos, entonces, ¿por qué el compilador genera esta línea? ¿Es un error? ¿O comportamiento "normal"?
(Podría trabajar con una máscara de bits, pero tengo curiosidad)
[ACTUALIZAR]
El operador parece no tener nada que ver con eso (ver la respuesta a continuación)
Usando el compilador eclipse (versión 4.10) obtengo este resultado más razonable:
getParent público (I) lanzo java / io / IOException
L0
LINENUMBER 77 L0
ILOAD 1
ICONST_4
IREM
ISTORE 2
L1
LINENUMBER 78 L
Entonces eso es más lógico.
javacno genera esto.
openjdk version "11.0.6" 2020-01-14en ubuntu 64 bit.
INVOKESTATIC