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 null
lagian, 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.
javac
tidak menghasilkan ini.
openjdk version "11.0.6" 2020-01-14
di ubuntu 64 bit.
INVOKESTATIC