[英]Overhead of DLL function call
從DLL調用函數時性能損失有多大? 加載DLL對我們來說不是問題,對highperf庫的調用次數不會很大。
大約一次調用多少指令/時鍾周期接管靜態庫調用?
我的答案是基於Linux / glibc / ELF動態鏈接器的工作原理,但我認為其他平台的總體答案是相同的:
第一次調用動態加載的符號與下一次調用之間存在差異。 第一次通話很昂貴,可能涉及很多周期。 所有其他電話或多或少都是1 - 2指令。
它的工作方式是鏈接器在Procedure Linkage Table中設置一個條目,該條目從Global Offset Table中獲取該外部函數的地址。 首先調用GOT的地址指向運行動態鏈接器的存根,以解析DLL中函數的實際地址。 這可能需要很多周期,但一旦完成一次,動態鏈接器將路徑GOT條目直接指向函數,因此下次調用PLT代碼時將直接調用該函數。
這是一個相當好的步驟來鏈接這個過程: http : //www.technovelty.org/linux/pltgot.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.