I'm trying to get as much performance as possible from some internal method.
The Java code is:
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
}
In my profiler I saw there is 1% CPU spend in java.util.Objects.requireNonNull
, but I don't even call that. When inspecting the bytecode, I saw this:
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
So the compiler generates this (useless?) check. I work on primitives, which cannot be null
anyways, so why does the compiler generate this line? Is it a bug? Or 'normal' behaviour?
(I might work around with a bitmask, but I'm just curious)
[UPDATE]
The operator seems to be having nothing to do with it (see answer below)
Using the eclipse compiler (version 4.10) I get this more reasonable result:
public getParent(I)I throws java/io/IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
So that is more logical.