Java Virtual Machine - การเพิ่มประสิทธิภาพ JIT
ในบทนี้เราจะเรียนรู้เกี่ยวกับ JIT Optimisations
วิธีการ Inlining
ในเทคนิคการเพิ่มประสิทธิภาพนี้คอมไพลเลอร์จะตัดสินใจแทนที่การเรียกฟังก์ชันของคุณด้วยเนื้อความของฟังก์ชัน ด้านล่างนี้เป็นตัวอย่างเดียวกัน -
int sum3;
static int add(int a, int b) {
return a + b;
}
public static void main(String…args) {
sum3 = add(5,7) + add(4,2);
}
//after method inlining
public static void main(String…args) {
sum3 = 5+ 7 + 4 + 2;
}
การใช้เทคนิคนี้คอมไพลเลอร์จะบันทึกเครื่องจากค่าใช้จ่ายในการเรียกใช้ฟังก์ชันใด ๆ (ต้องใช้การผลักดันและการเปิดพารามิเตอร์ไปยังสแต็ก) ดังนั้นโค้ดที่สร้างขึ้นจึงทำงานได้เร็วขึ้น
เมธอดอินไลน์สามารถทำได้สำหรับฟังก์ชันที่ไม่ใช่ฟังก์ชันเสมือนเท่านั้น (ฟังก์ชันที่ไม่ถูกแทนที่) พิจารณาว่าจะเกิดอะไรขึ้นหากเมธอด 'add' ถูกกำจัดมากเกินไปในคลาสย่อยและไม่ทราบชนิดของอ็อบเจ็กต์ที่มีเมธอดจนกว่าจะรันไทม์ ในกรณีนี้คอมไพเลอร์จะไม่รู้ว่าจะอินไลน์วิธีใด แต่ถ้าเมธอดถูกทำเครื่องหมายเป็น 'ขั้นสุดท้าย' คอมไพเลอร์จะรู้ได้อย่างง่ายดายว่าสามารถอินไลน์ได้เนื่องจากคลาสย่อยใด ๆ ไม่สามารถโอเวอร์คลาสได้ โปรดทราบว่าไม่มีการรับประกันเลยว่าวิธีการขั้นสุดท้ายจะเรียงกันเสมอไป
ไม่สามารถเข้าถึงได้และการกำจัดรหัสตาย
รหัสที่ไม่สามารถเข้าถึงได้คือรหัสที่ไม่สามารถเข้าถึงได้ด้วยขั้นตอนการดำเนินการที่เป็นไปได้ เราจะพิจารณาตัวอย่างต่อไปนี้ -
void foo() {
if (a) return;
else return;
foobar(a,b); //unreachable code, compile time error
}
รหัสตายยังเป็นรหัสที่ไม่สามารถเข้าถึงได้ แต่คอมไพเลอร์จะคายข้อผิดพลาดออกมาในกรณีนี้ แต่เราได้รับคำเตือนแทน แต่ละบล็อกของโค้ดเช่นตัวสร้างฟังก์ชันลองจับถ้าในขณะที่ ฯลฯ มีกฎของตัวเองสำหรับโค้ดที่ไม่สามารถเข้าถึงได้ซึ่งกำหนดไว้ใน JLS (ข้อกำหนดภาษา Java)
พับคงที่
หากต้องการทำความเข้าใจแนวคิดการพับแบบคงที่โปรดดูตัวอย่างด้านล่าง
final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.