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 null
todos 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.
javac
no genera esto.
openjdk version "11.0.6" 2020-01-14
en ubuntu 64 bit.
INVOKESTATIC