ฉันพยายามทำให้ได้ประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้จากวิธีการภายในบางอย่าง
รหัส 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