2011-09-03 35 views
6

Làm thế nào lớn là một hình phạt hiệu suất khi gọi chức năng từ DLL? Tải DLL không phải là vấn đề đối với chúng tôi, số lượng cuộc gọi đến thư viện highperf của chúng tôi sẽ không lớn.Overhead của chức năng DLL gọi

Khoảng, có bao nhiêu lệnh/chu kỳ đồng hồ mà một cuộc gọi thực hiện cuộc gọi thư viện tĩnh?

+0

thể trùng lặp của [Overhead của DLL] (http://stackoverflow.com/questions/4030043/overhead-of-dll) –

Trả lời

11

câu trả lời của tôi là dựa vào cách Linux/glibc/ELF công trình mối liên kết năng động, nhưng tôi sẽ giả định câu trả lời chung là như nhau cho các nền tảng khác:

Có sự khác biệt giữa các cuộc gọi đầu tiên vào một động nạp biểu tượng và các cuộc gọi tiếp theo. Cuộc gọi đầu tiên là tốn kém, có thể liên quan đến nhiều chu kỳ. Tất cả các cuộc gọi khác đều cách nhau ít hơn 1 - 2 lệnh.

Cách hoạt động là trình liên kết thiết lập mục nhập trong Bảng liên kết thủ tục lấy địa chỉ cho hàm bên ngoài đó từ Bảng bù toàn cầu. Lúc đầu, hãy gọi địa chỉ của các điểm GOT tới một nhánh để chạy trình liên kết động để giải quyết địa chỉ thực của hàm trong tệp DLL. Điều này có thể mất rất nhiều chu kỳ, nhưng một khi nó được thực hiện một lần, trình liên kết động sẽ dẫn đường vào GOT để trỏ trực tiếp đến hàm, vì vậy lần sau mã PLT được gọi sẽ gọi trực tiếp đến hàm.

Đây là một liên kết đến một đi bộ khá tốt thông qua các quá trình này: http://www.technovelty.org/linux/pltgot.html

+1

Trong một DLL trên Windows tất cả các công việc được thực hiện bởi bộ nạp tại thời gian tải mô-đun. –

+0

Tôi tin rằng đó chỉ là sự thật nếu DLL không được nạp động với LoadLibrary. –

+0

@Tamas: Tại sao? Bởi vì chúng ta cần tải thời gian chạy. – Cartesius00

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