ฉันพยายามทำให้ได้ประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้จากวิธีการภายในบางอย่าง
รหัส Java คือ:
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
}
ในผู้สร้างโปรไฟล์ของฉันฉันเห็นว่ามีการใช้ CPU 1% java.util.Objects.requireNonNull
แต่ฉันไม่ได้เรียกมันว่า เมื่อตรวจสอบรหัสไบต์ฉันเห็นสิ่งนี้:
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
ดังนั้นคอมไพเลอร์สร้างเช็ค (ไร้ประโยชน์) นี้ ฉันทำงานกับสิ่งพื้นฐานซึ่งไม่สามารถอยู่ได้null
ดังนั้นทำไมคอมไพเลอร์สร้างบรรทัดนี้ มันเป็นข้อบกพร่องหรือไม่? หรือพฤติกรรม 'ปกติ'
(ฉันอาจทำงานกับ bitmask แต่ฉันแค่อยากรู้อยากเห็น)
[อัปเดต]
ผู้ประกอบการดูเหมือนจะไม่มีส่วนเกี่ยวข้องกับมัน (ดูคำตอบด้านล่าง)
การใช้คอมไพเลอร์ eclipse (เวอร์ชั่น 4.10) ฉันได้รับผลลัพธ์ที่สมเหตุสมผลมากขึ้น:
public getParent (I) ฉันโยน java / io / IOException L0 LINENUMBER 77 L0 ILOAD 1 ICONST_4 IREM ตอนที่ 2 L1 LINENUMBER 78 L
นั่นคือเหตุผลที่มากกว่า
javac
จะไม่สร้างสิ่งนี้
openjdk version "11.0.6" 2020-01-14
บน Ubuntu 64 บิต
INVOKESTATIC