2011-01-04 5 views
38

Tôi tin rằng tôi hiểu các khái niệm cơ bản của hàm nội tuyến: thay vì một cuộc gọi hàm dẫn đến các tham số được đặt trên ngăn xếp và thao tác gọi xảy ra, định nghĩa của hàm được sao chép vào thời gian biên dịch. chi phí yêu cầu khi chạy.Khi nào tôi nên (và tôi không nên) sử dụng chú thích @inline của Scala?

Vì vậy, tôi muốn biết:

  • Liệu scalac khéo léo sử dụng để nội tuyến một số chức năng (ví dụ def tư nhân) mà không có sự gợi ý từ các chú thích?

  • Làm thế nào để đánh giá khi nào là một ý tưởng tốt để gợi ý cho scalac rằng nó inlines một chức năng?

  • Bất kỳ ai cũng có thể chia sẻ các ví dụ về chức năng hoặc lời gọi nên hoặc không nên được gạch chân?

+5

điều này có thể hữu ích: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance – Arjan

Trả lời

32

Never @inline bất cứ điều gì mà thực hiện có thể thay đổi một cách hợp lý và đó sẽ là một công một phần của một thư viện.

Khi tôi nói "thay đổi triển khai", tôi có nghĩa là logic thực sự có thể thay đổi. Ví dụ:

object TradeComparator extends java.lang.Comparator[Trade] { 
    @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time 
} 

Giả sử "so sánh tự nhiên" sau đó được thay đổi dựa trên bộ đếm nguyên tử. Bạn có thể thấy rằng một ứng dụng kết thúc với 2 thành phần, mỗi thành phần được xây dựng và được gạch chân dựa trên các phiên bản khác nhau của mã so sánh.

+11

Đây là câu trả lời rất hay khi KHÔNG sử dụng. Có một số guildelines khi bạn NÊN sử dụng nó? Tôi có nên bắt đầu đặt quảng cáo ở mọi nơi ngoại trừ các chức năng API công khai không? Hoặc là scalac + JVM đủ thông minh mà tôi hầu như không cần phải đặt nó ở bất cứ đâu? –

+1

Chấp nhận điều này như một câu trả lời hay cho thời điểm cần tránh @inline. Câu hỏi này giải thích tại sao nó có thể không được sử dụng nhiều để sử dụng: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance –

0

Cá nhân, tôi sử dụng @inline cho bí danh:

class A(param: Param){ 
    @inline def a = param.a 
    def a2() = a * a 
} 

Bây giờ, tôi không thể tìm thấy một cách để biết nếu nó làm bất cứ điều gì (Tôi cố gắng để jad các .class được tạo ra, nhưng không thể kết luận bất cứ điều gì).

Mục tiêu của tôi là làm rõ những gì tôi muốn trình biên dịch thực hiện. Nhưng hãy để nó quyết định những gì tốt nhất, hoặc đơn giản là làm những gì nó có khả năng. Nếu nó không làm điều đó, có lẽ phiên bản trình biên dịch sau này sẽ.