Ich versuche, mit einer internen Methode so viel Leistung wie möglich zu erzielen.
Der Java-Code lautet:
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 meinem Profiler habe ich gesehen, dass 1% der CPU-Ausgaben anfallen java.util.Objects.requireNonNull
, aber ich nenne das nicht einmal. Bei der Überprüfung des Bytecodes habe ich Folgendes gesehen:
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
Der Compiler generiert also diese (nutzlose?) Prüfung. Ich arbeite an null
Grundelementen, die sowieso nicht sein können. Warum generiert der Compiler diese Zeile? Ist es ein Fehler? Oder "normales" Verhalten?
(Ich könnte mit einer Bitmaske herumarbeiten, aber ich bin nur neugierig)
[AKTUALISIEREN]
Der Bediener scheint nichts damit zu tun zu haben (siehe Antwort unten)
Mit dem Eclipse-Compiler (Version 4.10) erhalte ich dieses vernünftigere Ergebnis:
public getParent (I) Ich löse java / io / IOException L0 LEINENUMMER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LEINENUMBER 78 L.
Das ist also logischer.
javac
erzeugt dies nicht.
openjdk version "11.0.6" 2020-01-14
auf Ubuntu 64 Bit kompiliert .
INVOKESTATIC