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 nullzaten 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ı.
javacbunu üretmez.
openjdk version "11.0.6" 2020-01-1464 bit üzerinde java 11 ile Intellij 2019.3'ten derlenmiştir .
INVOKESTATIC