Hoặc thực hiện nó chỉ lộn xộn lên mã cho một cái gì đó JIT sẽ chăm sóc tự động không?Chú thích @inline trong Scala có thực sự giúp hiệu suất không?
58
A
Trả lời
53
Tôi chưa tìm thấy trường hợp nó cải thiện hiệu suất và tôi đã thử ở một vài điểm khác nhau. JVM có vẻ khá giỏi trong nội tuyến khi có thể, và ngay cả khi bạn yêu cầu @inline trong Scala, nó không thể luôn làm điều đó (và đôi khi tôi nhận thấy rằng nó thậm chí không khi tôi nghĩ rằng nó phải có thể).
Nơi bạn mong đợi để thấy sự khác biệt bytecode là trong một cái gì đó như thế này:
object InlineExample {
final class C(val i: Int) {
@inline def t2 = i*2
@inline def t4 = t2*2
}
final class D(val i: Int) {
def t2 = i*2
def t4 = t2*2
}
}
khi biên soạn với -optimise
. Và bạn thấy sự khác biệt, nhưng nó thường không chạy nhanh hơn vì trình biên dịch JIT có thể nhận thấy rằng các tối ưu hóa tương tự áp dụng cho D
.
Vì vậy, có thể đáng thử trong các giai đoạn tối ưu hóa cuối cùng, nhưng tôi sẽ không bận tâm thực hiện thường xuyên mà không kiểm tra xem nó có tạo nên sự khác biệt về hiệu suất hay không.
Cảm ơn bạn đã báo cáo kết quả kiểm tra của mình; cứu tôi và có lẽ những người khác một thời gian :) –
Bạn đối số chỉ đúng nếu chỉ có một trình biên dịch JIT trên hành tinh. - Nhưng điều này là không đúng sự thật. Có Android, có IBM sản xuất các JVM riêng. Vì vậy, bất cứ điều gì trình biên dịch Scala không * chắc chắn * là tốt hơn sau đó một cái gì đó một số JIT * có thể * làm. – Martin
@Martin - Tôi thừa nhận rằng chưa thử Android. Tôi đã thử JRockit và IBM JVM với hiệu ứng tương tự như Sun JVM (tức là không có). –