1) dựa trên thực tế là việc gọi hàm DLL luôn sử dụng bước nhảy gián tiếp bổ sung. Ngày nay, điều này thường không đáng kể. Bên trong DLL có thêm một số chi phí trên CPU i386, vì chúng không thể tạo mã độc lập vị trí. Trên amd64, các bước nhảy có thể liên quan đến bộ đếm chương trình, vì vậy đây là một cải tiến rất lớn.
2) Điều này đúng. Với tối ưu hóa được hướng dẫn bằng cách định hình, bạn thường có thể giành được hiệu suất khoảng 10-15 phần trăm. Bây giờ tốc độ CPU đã đạt đến giới hạn của nó, nó có thể đáng để làm điều đó.
Tôi sẽ thêm: (3) trình liên kết có thể sắp xếp các chức năng trong một nhóm hiệu quả bộ đệm hơn, do đó các lỗi bộ nhớ cache đắt tiền được giảm thiểu. Nó cũng có thể đặc biệt ảnh hưởng đến thời gian khởi động của các ứng dụng (dựa trên kết quả tôi đã thấy với trình biên dịch Sun C ++)
Và đừng quên rằng với DLL, không thể loại bỏ mã chết. Tùy thuộc vào ngôn ngữ, mã DLL có thể không tối ưu. Các hàm ảo luôn là ảo vì trình biên dịch không biết liệu máy khách có ghi đè lên nó hay không.
Vì những lý do này, trong trường hợp không có nhu cầu thực sự về DLL, thì chỉ cần sử dụng biên dịch tĩnh.
EDIT (để trả lời bình luận, bởi người dùng gạch dưới)
Đây là một tài nguyên tốt về vấn đề mã độc lập vị trí http://eli.thegreenplace.net/2011/11/03/poseition-indeperee-code-pic-in-spl-lologists/
Như đã giải thích x86 không có chúng AFAIK cho bất cứ điều gì khác sau đó phạm vi nhảy 15 bit và không cho các bước nhảy và cuộc gọi vô điều kiện. Đó là lý do tại sao các chức năng (từ máy phát điện) có hơn 32K luôn là một vấn đề và cần đến các tấm bạt lò xo nhúng.
Nhưng trên HĐH x86 phổ biến như Linux, bạn không cần quan tâm nếu tệp .so / DLL không được tạo bằng gcc
khóa chuyển -fpic
(thực thi việc sử dụng các bảng nhảy gián tiếp). Bởi vì nếu bạn không làm vậy, mã chỉ được sửa như một trình liên kết thông thường sẽ di chuyển nó. Nhưng trong khi thực hiện điều này, nó làm cho phân đoạn mã không thể chia sẻ được và nó sẽ cần ánh xạ toàn bộ mã từ đĩa vào bộ nhớ và chạm vào tất cả trước khi có thể sử dụng (làm trống hầu hết các bộ đệm, nhấn TLB), v.v. khi điều này được coi là chậm.
Vì vậy, bạn sẽ không có bất kỳ lợi ích nữa.
Tôi không nhớ lại những gì hệ điều hành (Solaris hoặc FreeBSD) đã cho tôi vấn đề với xây dựng hệ thống Unix của tôi vì tôi chỉ là không làm điều này và tự hỏi tại sao nó bị rơi cho đến khi tôi áp dụng -fPIC
để gcc
.