Próbuję uzyskać jak największą wydajność z jakiejś metody wewnętrznej.
Kod Java to:
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
}
W moim programie do profilowania zauważyłem, że na procesor przeznaczono 1% java.util.Objects.requireNonNull
, ale nawet tego nie nazywam. Podczas sprawdzania kodu bajtowego zobaczyłem to:
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
Tak więc kompilator generuje to (bezużyteczne?) Sprawdzenie. Pracuję na prymitywach, które i tak nie mogą być null
, więc dlaczego kompilator generuje tę linię? Czy to błąd? Czy „normalne” zachowanie?
(Mogę pracować z maską bitową, ale jestem po prostu ciekawy)
[AKTUALIZACJA]
Wydaje się, że operator nie ma z tym nic wspólnego (patrz odpowiedź poniżej)
Używając kompilatora Eclipse (wersja 4.10) otrzymuję ten bardziej rozsądny wynik:
public getParent (I) Zgłasza wyjątek java / io / IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L.
To jest bardziej logiczne.
javac
tego nie generuje.
openjdk version "11.0.6" 2020-01-14
na 64-bitowym Ubuntu.
INVOKESTATIC