2010-01-25 34 views
5

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ì?

+0

@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

+0

chủ yếu là số lượng các hướng dẫn tôi tin rằng ... –

Trả lời

7

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ư

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.)

0

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ể.

+2

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

0

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.

0

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.

+0

.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

+0

.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. –

+0

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 đó. –

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