2009-11-28 26 views
5

Điều gì sẽ xảy ra với các chức năng hoặc thủ tục nội tuyến trong Delphi (cụ thể là v2010 ở đây, nhưng tôi có cùng vấn đề với Turbo Delphi)?Delphi 2010 inlining vô ích?

Có một số sự không nhất quán trong trợ giúp về nó có thể không phải luôn luôn nội tuyến một chức năng vì "tiêu chí nhất định" bất cứ điều gì có nghĩa là.

Nhưng tôi thấy rằng các chức năng nội tuyến thường xuyên (ngay cả những hàm rất đơn giản có 3 hoặc 4 dòng mã) làm chậm mã hơn là tăng tốc.

Một ý tưởng tuyệt vời sẽ là tùy chọn trình biên dịch để "nội tuyến mọi thứ". Tôi không quan tâm nếu exe của tôi tăng 50% hoặc hơn để làm cho nó hoạt động nhanh hơn.

Có cách nào tôi có thể buộc Delphi thực sự mã nội tuyến ngay cả khi nó không được quyết định để được inlinded bởi trình biên dịch? Điều đó thực sự hữu ích. Nếu không, bạn cần thực hiện "thủ công nội tuyến" để sao chép mã thủ tục trên nhiều vùng mã của bạn với các nhận xét như "// nội tuyến thất bại ở đây, vì vậy nếu bạn thay đổi 5 dòng tiếp theo, hãy thay đổi chúng trong 8 điểm trùng lặp khác "

Mọi mẹo ở đây?

Trả lời

11

Có tùy chọn trình biên dịch để tự động nội tuyến các quy trình ngắn. Trong Tùy chọn dự án, trong trình biên dịch Delphi -> Biên dịch -> Tạo mã, hãy chuyển "Kiểm soát nội tuyến mã" thành Tự động. Tuy nhiên, hãy lưu ý rằng điều này chỉ nên có trên bản phát hành bản phát hành, vì mã nội tuyến khó sửa lỗi.

Ngoài ra, bạn nói rằng bạn không ngại làm cho chương trình của mình lớn hơn miễn là chương trình nhanh hơn, nhưng thường có nội tuyến làm cho nó chậm hơn. Bạn nên biết rằng điều đó có thể liên quan. Mã được biên dịch của bạn càng lớn, càng có nhiều bộ nhớ cache lệnh bạn sẽ có, làm chậm quá trình thực thi.

Nếu bạn thực sự muốn tăng tốc chương trình của mình, hãy chạy chương trình thông qua trình thu thập thông tin. Tôi khuyên bạn nên Sampling Profiler, miễn phí, được thực hiện để làm việc với mã Delphi (bao gồm cả năm 2010) và không làm chậm quá trình thực thi của bạn. Nó sẽ hiển thị cho bạn một báo cáo chi tiết về mã bạn đang thực sự dành nhiều thời gian thực thi nhất. Khi bạn đã tìm thấy điều đó, bạn có thể tập trung vào các nút cổ chai và cố gắng tối ưu hóa chúng.

+1

Mã điều khiển nội tuyến được đặt thành tự động không được trợ giúp. Lấy mẫu Profiler là rất tốt. Rất hữu ích trong việc hiển thị nơi mà các nút cổ chai là trong số liệu thống kê thực sự. Ngay cả khi nó thực sự cho tôi thấy những gì tôi đã mới. Nó sẽ có ích trong tương lai chắc chắn. Cảm ơn. – TallGuy

3

Nội tuyến có thể làm mọi việc chậm hơn trong một số trường hợp. Hàm nội tuyến có thể tăng số lượng thanh ghi CPU cần thiết cho các biến cục bộ. Nếu không có đủ đăng ký biến có sẵn sẽ được đặt trong bộ nhớ thay vào đó, làm cho nó chậm hơn.

Nếu chức năng không được gạch chân, nó sẽ có (gần như) tất cả các thanh ghi CPU có sẵn.

Tôi thấy rằng thường không phải là ý tưởng hay đối với các hàm nội tuyến có chứa vòng lặp. Họ sẽ sử dụng một vài biến có khả năng kết thúc trong bộ nhớ, làm cho mã nội tuyến chậm hơn.

+2

Tăng số byte cần thiết để chạy một thuật toán nhất định, cũng sẽ sử dụng nhiều bộ đệm CPU hơn. Trong trường hợp hiếm hoi, điều này cũng có thể có tác dụng. –

+3

Lars +1 - ngoại trừ việc nó không phải là hiếm. –

1

Nếu bạn muốn lực nội tuyến thì hãy sử dụng bao gồm tệp. Bạn cần đảm bảo bạn khai báo các biến chính xác và sau đó sử dụng {$ I filename.inc}. Điều đó sẽ luôn luôn tiêm mã cụ thể đó ngay tại nơi bạn muốn, và làm cho nó dễ dàng hơn để duy trì nếu bạn cần thay đổi nó. Hãy nhớ rằng trình biên dịch được viết bởi những người thông minh hơn, hầu hết chỉ là những con người (bao gồm cả bản thân tôi) và có quyền truy cập vào nhiều thông tin hơn khi quyết định nội tuyến hay không, vì vậy khi nó không trực tuyến, nó có thể có lý do chính đáng .

0

Nếu tôi hiểu một trong các trình biên dịch của trình biên dịch FPC (có cùng vấn đề) một cách chính xác, nội tuyến chỉ có thể xảy ra khi thường trình được biên dịch.

IOW nếu bạn làm cho đơn vị với các chức năng được sắp xếp để trở thành một đơn vị "lá", và đặt nó như là đầu tiên trong mệnh đề sử dụng của dự án của bạn (.dpr), nó sẽ là ok. Lưu ý rằng với đơn vị "lá", tôi có nghĩa là một đơn vị không phụ thuộc vào các đơn vị khác trong dự án, chỉ trên các đơn vị đã biên dịch.

Tôi sẽ không ngạc nhiên khi nó giống nhau ở Delphi, vì nó chia sẻ một hệ thống đơn vị dựa trên cùng một nguyên tắc.

Nó cũng khá dễ tháo rời mà không vi phạm nguyên tắc biên dịch riêng biệt.

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