Nội tuyến là một tối ưu hóa được thực hiện bởi trình biên dịch Java Just-In-Time.
Nếu bạn có một phương pháp:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
mà bạn gọi như thế này:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
trình biên dịch có thể quyết định thay thế cuộc gọi chức năng của bạn với các cơ quan chức năng, vì vậy kết quả sẽ có hiệu quả giống như sau:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
Trình biên dịch thực hiện việc này để tiết kiệm chi phí o f thực sự thực hiện cuộc gọi hàm, điều này sẽ liên quan đến việc đẩy từng thông số vào ngăn xếp.
Điều này chỉ có thể được thực hiện rõ ràng cho các chức năng không phải ảo. Hãy xem xét điều gì sẽ xảy ra nếu phương thức được overriden trong một lớp con và kiểu đối tượng chứa phương thức không được biết cho đến khi chạy ... làm thế nào trình biên dịch biết mã nào cần sao chép: cơ sở phương thức của lớp cơ sở hoặc lớp con phương pháp cơ thể? Vì tất cả các phương thức là ảo theo mặc định trong Java, bạn có thể đánh dấu rõ ràng các phương thức không thể được ghi đè là final
(hoặc đặt chúng vào lớp final
). Điều này sẽ giúp trình biên dịch hiểu rằng phương thức đó sẽ không bao giờ được ghi đè lên, và nó an toàn để nội tuyến. (Lưu ý rằng trình biên dịch đôi khi có thể đưa ra quyết định này cho các phương pháp không phải là cuối cùng.)
Ngoài ra, hãy lưu ý từ có thể trong báo giá. Các phương thức cuối cùng không được đảm bảo là không thể in được. Có nhiều cách khác nhau mà bạn có thể đảm bảo một phương pháp không có khả năng được inlined, nhưng không có cách nào để buộc trình biên dịch vào nội tuyến. Nó sẽ hầu như luôn luôn biết tốt hơn bạn anyway khi nội tuyến sẽ giúp đỡ vs làm tổn thương tốc độ của mã kết quả.
Xem wikipedia để có tổng quan tốt về lợi ích và sự cố.
Nguồn
2010-10-13 14:59:59
Điều này sẽ giúp ích: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict