Sto cercando di ottenere il massimo delle prestazioni da un metodo interno.
Il codice 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
}
Nel mio profiler ho visto che c'è una spesa della CPU dell'1% java.util.Objects.requireNonNull
, ma non la chiamo nemmeno. Durante l'ispezione del bytecode, ho visto questo:
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
Quindi il compilatore genera questo controllo (inutile?). Lavoro su primitive, che non possono essere null
comunque, quindi perché il compilatore genera questa riga? E 'un errore? O comportamento 'normale'?
(Potrei lavorare con una maschera di bit, ma sono solo curioso)
[AGGIORNARE]
L'operatore sembra non avere nulla a che fare con esso (vedi risposta sotto)
Usando il compilatore eclipse (versione 4.10) ottengo questo risultato più ragionevole:
public getParent (I) I genera java / io / IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
Quindi è più logico.
javac
non genera questo.
openjdk version "11.0.6" 2020-01-14
su Ubuntu 64 bit.
INVOKESTATIC