2011-12-26 25 views
7

Câu hỏi của tôi khá đơn giản:Xác suất của getter và setter bị inlined bởi trình biên dịch

Q: các cơ hội mà một phương thức getter/setter sẽ được inlined bởi trình biên dịch trong Java là gì?
(Rõ ràng là không có câu trả lời rõ ràng cho điều này, nhưng các thông tin khác sẽ được đánh giá cao)

Bổ sung: Tôi hiểu rằng sẽ luôn có một phương thức và khi nói đến getters và setters, điều này thường là điều người lập trình muốn.

Xin cảm ơn trước.

+2

C1 hoặc C2 (ví dụ: máy khách hoặc máy chủ)? Nhưng một trong hai cách rất cao, vì vậy bạn có thể giả sử nó miễn là mã là 'nóng'. Nếu bạn muốn chứng minh nó, hãy sử dụng -XX: ++ PrintAssembly để kiểm tra mã được tạo ra. Vấn đề duy nhất sẽ là nội tuyến "ngân sách" được giới hạn hơn trên trình biên dịch C1. – bestsss

Trả lời

3

Trình biên dịch (javac) có xu hướng có tác động không đáng kể đến tối ưu hóa, khi tối ưu hóa diễn ra vào thời gian chạy. Khi có JIT có, nó có thể sẽ là nội tuyến sớm hay muộn. Tùy thuộc vào mức độ mã được sử dụng, vì vậy một cuộc gọi hàm trên đầu có thể được nhìn thấy lúc đầu, nhưng khi getter/setter được gọi là đủ thường xuyên sau đó nó được inlined.

+0

javac có một thời gian khó nội tuyến vì chúng tôi vẫn muốn có một dấu vết stack hợp lệ tại bất kỳ điểm nào trong thời gian. Nhưng tại sao phải quan tâm đến chi phí cuộc gọi của một phương pháp được gọi là chỉ vài trăm lần? C2 có một ngân sách nội tuyến đủ lớn, trong thực tế, có nghĩa là một getter/setter sẽ luôn luôn được inlined bằng cách nào đó. C1 có thể được giới hạn hơn trong vấn đề đó mặc dù. – Voo

+0

đúng. Tôi đang cố gắng giải quyết câu hỏi xác suất của chúng được inline. – Shaunak

+1

javac có thể không nội tuyến ở tất cả – bestsss

2

Tôi tưởng tượng về số không (ít nhất là trong trường hợp không phải JIT), vì đây là các quy ước Java Bean và chúng luôn cần phải được công khai, do đó trình biên dịch không thể dự đoán ai có thể gọi phương thức. Bạn có thể thay đổi việc thực hiện một trong các thao tác này sẽ phá vỡ trình gọi nội tuyến. Không có gì để yêu cầu rằng họ cần phải được thực hiện chỉ để thiết lập một lĩnh vực.

2

Trình biên dịch có thể nội tuyến khi phương thức là final và người truy cập có thể truy cập vào các trường truy cập. Sau đó, nó lên đến trình biên dịch để xác định xem phương pháp này là "đơn giản" đủ cho nội tuyến.

Trong thực tế, thiết lập hoặc nhận được một trường thường được coi là đơn giản, do đó, một người truy cập cuối cùng cho một trường có thể truy cập sẽ được inlined. Người truy cập cho các trường riêng sẽ được inlined trong lớp khai báo của họ; accessors cho các trường được bảo vệ sẽ được inlined trong suốt gói khai báo và bất kỳ lớp dẫn xuất nào; & c.

Khi chạy, JIT có khả năng thực hiện nội tuyến bổ sung dựa trên phân tích mã đang chạy.

+0

Số lần mà bộ thu thập dữ liệu được thiết lập có ảnh hưởng đến khả năng JIT sẽ xem xét nội tuyến không? Có một cái gì đó tương tự như từ khóa 'inline' (C++) trong Java, mà đề xuất nội tuyến một phương thức? – Acidic

+0

Có, sử dụng là một yếu tố cho JIT khi chạy. Nhưng không có gợi ý nội tuyến rõ ràng bạn có thể cung cấp cho trình biên dịch. – erickson

+0

Cảm ơn. Tôi đã phải bỏ lỡ nó lần đầu tiên - những gì đã làm u có nghĩa là bởi 'accessor' cuối cùng? – Acidic

Các vấn đề liên quan