J'essaie d'obtenir autant de performances que possible à partir d'une méthode interne.
Le code Java est:
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
}
Dans mon profileur, j'ai vu qu'il y avait 1% de dépenses CPU java.util.Objects.requireNonNull
, mais je n'appelle même pas cela. Lors de l'inspection du bytecode, j'ai vu ceci:
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
Le compilateur génère donc cette vérification (inutile?). Je travaille sur des primitives, ce qui ne peut pas être de null
toute façon, alors pourquoi le compilateur génère-t-il cette ligne? Est-ce un bug? Ou un comportement «normal»?
(Je pourrais travailler avec un bitmask, mais je suis juste curieux)
[MISE À JOUR]
L'opérateur semble n'avoir rien à voir avec cela (voir la réponse ci-dessous)
En utilisant le compilateur eclipse (version 4.10) j'obtiens ce résultat plus raisonnable:
public getParent (I) I lève java / io / IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
C'est donc plus logique.
javac
ne génère pas cela.
openjdk version "11.0.6" 2020-01-14
sur ubuntu 64 bits.
INVOKESTATIC