Saya mencoba mendapatkan kinerja sebanyak mungkin dari beberapa metode internal.
Kode Java adalah:
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
}
Di profiler saya, saya melihat ada pengeluaran CPU 1% java.util.Objects.requireNonNull, tapi saya bahkan tidak menyebutnya. Saat memeriksa bytecode, saya melihat ini:
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
Jadi kompiler menghasilkan cek (tidak berguna) ini. Saya bekerja pada primitif, yang tidak bisa nulllagian, jadi mengapa kompiler menghasilkan baris ini? Apakah ini bug? Atau perilaku 'normal'?
(Saya mungkin bekerja dengan bitmask, tapi saya hanya ingin tahu)
[MEMPERBARUI]
Operator tampaknya tidak ada hubungannya dengan itu (lihat jawaban di bawah)
Menggunakan compiler eclipse (versi 4.10) saya mendapatkan hasil yang lebih masuk akal ini:
getParent publik (I) saya melempar java / io / IOException
L0
LINENUMBER 77 L0
ILOAD 1
ICONST_4
IREM
ISTORE 2
L1
LINENUMBER 78 L
Jadi itu lebih masuk akal.
javactidak menghasilkan ini.
openjdk version "11.0.6" 2020-01-14di ubuntu 64 bit.
INVOKESTATIC