2011-09-03 64 views
6

從DLL調用函數時性能損失有多大?加載DLL對我們來說不是問題,對我們highperf庫的調用次數不會很大。DLL函數調用的開銷

大約,一個調用會接收一個靜態庫調用多少個指令/時鐘週期?

+0

[DLL的架空]的可能重複(http://stackoverflow.com/questions/4030043/overhead-of-dll) –

回答

11

我的答案是基於如何在Linux/glibc的/ ELF動態鏈接的作品,但我會假設整體答案是其他平臺一樣的:

有一個動態加載的第一個電話之間的差異符號和下一個呼叫。第一個電話很貴,可能涉及很多週期。所有其他呼叫或多或少都在1-2條指令之外。

它的工作方式是鏈接器在Procedure Linkage Table中設置一個條目,該條目從Global Offset Table獲取該外部函數的地址。首先,將GOT的地址指向運行動態鏈接程序的存根,以解析DLL中函數的實際地址。這可能需要很多週期,但一旦完成一次,動態鏈接器將路徑GOT條目直接指向該函數,因此下一次調用PLT代碼將直接調用該函數。

這裏是通過這個過程的一個鏈接到一個相當好走:http://www.technovelty.org/linux/pltgot.html

+1

在Windows上的DLL中,所有這些工作都是在模塊加載時由加載程序完成的。 –

+0

我相信只有當DLL沒有被LoadLibrary動態加載時纔會出現這種情況。 –

+0

@Tamas:爲什麼?因爲我們需要運行時加載。 – Cartesius00