Bazı iç yöntemlerden mümkün olduğunca fazla performans elde etmeye çalışıyorum.
Java kodu:
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
}
Profilimde% 1 CPU harcaması olduğunu gördüm java.util.Objects.requireNonNull
, ama bunu bile aramıyorum. Bayt kodunu incelerken şunu gördüm:
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
Böylece derleyici bu (yararsız?) Kontrol üretir. Ben null
zaten olamaz ilkel üzerinde çalışıyorum, neden derleyici bu satırı üretir? Bu bir hata mı? Yoksa 'normal' davranış mı?
(Bir bit maskesi ile çalışabilirim, ama sadece merak ediyorum)
[GÜNCELLEME]
Operatörün bununla hiçbir ilgisi yok gibi görünüyor (aşağıdaki cevaba bakınız)
Tutulma derleyicisini (sürüm 4.10) kullanarak bu daha makul bir sonuç elde ederim:
public getParent (I) java / io / IOException'ı atar L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ISTORE 2 L1 LINENUMBER 78 L
Yani bu daha mantıklı.
javac
bunu üretmez.
openjdk version "11.0.6" 2020-01-14
64 bit üzerinde java 11 ile Intellij 2019.3'ten derlenmiştir .
INVOKESTATIC