Estou tentando obter o máximo desempenho possível de algum método interno.
O código Java é:
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
}
No meu profiler, vi 1% de gasto de CPU java.util.Objects.requireNonNull
, mas nem chamo isso. Ao inspecionar o bytecode, vi o seguinte:
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
Portanto, o compilador gera essa verificação (inútil?). Eu trabalho com primitivas, que não podem ser null
assim, por que o compilador gera essa linha? Isso é um bug? Ou comportamento 'normal'?
(Eu posso trabalhar com uma máscara de bit, mas estou curioso)
[ATUALIZAR]
O operador parece não ter nada a ver com isso (veja a resposta abaixo)
Usando o compilador eclipse (versão 4.10), obtenho esse resultado mais razoável:
public getParent (I) lança java / io / IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
Então isso é mais lógico.
javac
não gera isso.
openjdk version "11.0.6" 2020-01-14
no ubuntu 64 bits.
INVOKESTATIC