Xem xét rằng bạn đang cố gắng duy nhất để tối ưu hóa tốc độ, chẩn đoán tốt cho quyết định có nên nội tuyến một chức năng hay không? Rõ ràng kích thước mã nên là quan trọng, nhưng có bất kỳ yếu tố khác thường được sử dụng khi (nói) gcc hoặc icc là xác định liệu để inline một cuộc gọi chức năng? Có bất kỳ công việc học tập quan trọng nào trong khu vực không?Thuyết minh tốt cho các chức năng nội tuyến là gì?
Trả lời
Wikipedia có afew đoạn văn về vấn đề này, với một số liên kết ở phía dưới:
- Ngoài kích thước bộ nhớ và các vấn đề bộ nhớ cache, another consideration is register pressure. Từ quan điểm của trình biên dịch, các biến được bổ sung từ thủ tục nội tuyến có thể tiêu thụ các thanh ghi bổ sung, và trong một khu vực mà áp suất đăng ký đã cao, điều này có thể gây tràn, gây ra các truy cập RAM bổ sung.
Ngôn ngữ với các trình biên dịch JIT và lớp runtime tải có cân bằng khác kể từ khi phương pháp ảo không biết tĩnh, nhưng các JIT có thể thu thập runtime profiling thông tin, chẳng hạn như tần số gọi phương thức:
Design, Implementation, and Evaluation of Optimizations in a Just-in-Time Compiler (đối với Java) nói về phương pháp nội tuyến của các phương pháp tĩnh và các lớp được nạp động và các cải tiến của nó về hiệu năng.
Practicing JUDO: Java Under Dynamic Optimizations tuyên bố rằng "chính sách nội tuyến của họ dựa trên kích thước mã và thông tin hồ sơ. Nếu tần suất thực hiện mục nhập phương pháp thấp hơn ngưỡng nhất định, thì phương pháp này không được gạch chân vì nó được coi là phương pháp lạnh Để tránh sự bùng nổ mã, chúng tôi không inline một phương thức với kích thước bytecode hơn 25 byte ... Để tránh nội tuyến dọc theo một chuỗi cuộc gọi sâu, nội tuyến dừng lại khi kích thước bytecode được tích lũy bên trong chuỗi cuộc gọi vượt quá 40 byte. " Mặc dù chúng có thông tin định dạng thời gian chạy (tần số gọi phương thức) nhưng chúng vẫn cẩn thận để tránh nội tuyến các chức năng lớn hoặc các chuỗi chức năng để ngăn chặn sưng lên.
A search on Google Scholar tiết lộ một số giấy tờ, chẳng hạn như
- The effect of code expanding optimizations on instruction cache design
- Function Inlining under Code Size Constraints for Embedded Processors
A search on Google Books tiết lộ khá nhiều sách với giấy tờ hoặc chương về chức năng nội tuyến trong những bối cảnh khác nhau .
The Compiler Design Handbook: Optimizations and Machine Code Generation có một chương riêng về kỹ thuật Statisical và Machine Learning trong Compiler Thiết kế với công nghệ tự động thiết lập các thông số khác nhau, profiling kết quả. Chương này tham khảo Vaswani et al paper Microarchitecture Sensitive Empirical Models for Compiler Optimizations nơi họ đề xuất "việc sử dụng các kỹ thuật mô hình thực nghiệm để xây dựng các mô hình nhạy cảm kiến trúc vi mô cho tối ưu hóa trình biên dịch".
(Một số sách khác nói về inling từ quan điểm của lập trình viên, chẳng hạn như C++ for Game Programmers, nói về sự nguy hiểm của chức năng nội tuyến quá thường xuyên và sự khác biệt giữa nội tuyến và macro. có thể xác định rằng họ sẽ làm hại nhiều hơn lợi ích, điều này có thể được ghi đè bằng các macro như một phương sách cuối cùng.)
Một cuộc gọi hàm ngụ ý một số mã bổ sung (phần mở đầu hàm, nơi khung ngăn xếp mới được thiết lập và phần kết thúc hàm, nơi nó được làm sạch). Nếu trình biên dịch của bạn thấy rằng mã chức năng là nhỏ so với phần mở đầu và lời kết, nó có thể quyết định nó không đáng để thực hiện một cuộc gọi thực tế, và sẽ nội tuyến chức năng.
Lợi ích duy nhất tôi thấy khi gọi hàm thay vì nội tuyến có liên quan đến kích thước. Tôi đoán inlining một chức năng sau đó unrolling một vòng lặp có thể dẫn đến một sự gia tăng kích thước đáng kể.
Sẽ không nội tuyến cũng ảnh hưởng đến bộ nhớ đệm, do đó (nếu bạn không inline) mã chức năng sẽ được đặt trên một dòng bộ nhớ cache riêng biệt từ mã "chính"? – Mike
theo như tôi đã thấy, kích thước chức năng là trình biên dịch yếu tố duy nhất được sử dụng để xác định nội tuyến. Tuy nhiên nếu bạn làm tối ưu hóa hướng dẫn hồ sơ (PGO), tôi tin rằng trình biên dịch có thể sử dụng các biến khác, chẳng hạn như số lượng cuộc gọi/thời gian thiết lập cuộc gọi.
Trong .NET chủ yếu dựa trên kích thước. Đo kích thước của hàm cha và hàm con trong byte được biên dịch. Sau đó đo kích thước của hàm kết hợp. Nếu hàm kết hợp nhỏ hơn, thì nội tuyến là một ý tưởng hay.
Lý do là làm cho nó có thể đẩy nhiều mã vào bộ nhớ cache của CPU nhất có thể. Cache nhớ đắt hơn nhiều so với các cuộc gọi hàm trong các CPU hiện đại.
.NET đối phó với nhiều khả năng nội tuyến như thế nào (ví dụ: nếu func1 được gọi ở 3 vị trí khác nhau, .NET có thử tất cả các kết hợp nội tuyến hoặc chỉ tất cả hoặc không có gì) không? – Mike
.NET là JIT được biên dịch để nó có thể đưa ra quyết định với thông tin trong thời gian chạy về các khả năng nội tuyến khác nhau. Đây chỉ là trực giác của tôi, nhưng tôi sẽ ngạc nhiên nếu .NET DID NOT inline func1 khác nhau ở 3 nơi khác nhau vì nó cần có thông tin để đưa ra quyết định sáng suốt. Trong trường hợp đó, bạn muốn có một cuốn sách về công nghệ JIT. –
Thành thật mà nói, tôi không biết chi tiết tốt. Tôi chỉ đọc một bài viết trên đó. –
- 1. Chức năng nội tuyến
- 2. chức năng ảo nội tuyến
- 3. Chức năng băm tốt là gì?
- 4. Chức năng băm tốt cho từ tiếng Anh là gì?
- 5. Chức năng nội tuyến trong C++
- 6. Phương pháp nội tuyến là gì?
- 7. Chức năng nội tuyến có liên kết nội bộ?
- 8. "Chuỗi nội tuyến" là gì?
- 9. Phương pháp tốt nhất cho JavaScript nội tuyến động sandbox là gì?
- 10. Chức năng băm 32 bit tốt nhất cho các chuỗi ngắn (tên thẻ) là gì?
- 11. Lần khi không thể sử dụng chức năng nội tuyến
- 12. Chức năng nội tuyến và liên kết bên ngoài
- 13. Vòng lặp dựa trên dải và chức năng nội tuyến
- 14. C: Con trỏ trỏ tới nội tuyến chức năng
- 15. Chức năng __proto__ là gì?
- 16. lực nội tuyến chức năng trong đơn vị dịch khác
- 17. Các không gian tên nội tuyến là gì?
- 18. chức năng nội tuyến vẫn hiển thị trong tệp .prof
- 19. Lớp nội tuyến C++ là gì?
- 20. Chức năng "Trang" là gì?
- 21. Chức năng chặn là gì?
- 22. Điều gì sẽ xảy ra với chức năng nội tuyến bên ngoài?
- 23. Là hằng số hằng số chức năng nội tuyến duy nhất?
- 24. Bộ chức năng thông minh hoàn toàn
- 25. Các trường hợp sử dụng cho các chức năng đóng/gọi lại trong JavaScript là gì?
- 26. Đối số tốt nhất để thuyết phục các nhà phát triển học TDD là gì?
- 27. Liên kết cấp chức năng (/ Gy chuyển đổi trong VC++) - Điều gì là tốt cho?
- 28. nội tuyến một chức năng bên trong một hàm nội dòng khác trong C
- 29. Hướng dẫn tốt nhất cho các tuyến đường Rails cho hoàn toàn nhầm lẫn là gì?
- 30. Python - Vị trí tốt nhất cho các chức năng chung
@Mitch: Tất nhiên, nhưng tôi tò mò về cách trình biên dịch quyết định có nên nội tuyến hay không . – Mike
chủ yếu là số lượng các hướng dẫn tôi tin rằng ... –