假設我有一個庫--foo.so。當我構建我的二進制文件(需要這個庫)時,我可以(1)鏈接foo.so,或者,(2)在程序源代碼中,dlopen這個庫,然後調用該庫提供的函數dlopen vs連接開銷
Is there當我從庫中調用函數時,(1)和(2)之間的任何性能差異?請注意,我知道會有不同的初始化特性(如dlopen的開銷,第一次使用符號的開銷等),但在穩定狀態下,兩種選擇都同樣快,還是更快?
謝謝。
假設我有一個庫--foo.so。當我構建我的二進制文件(需要這個庫)時,我可以(1)鏈接foo.so,或者,(2)在程序源代碼中,dlopen這個庫,然後調用該庫提供的函數dlopen vs連接開銷
Is there當我從庫中調用函數時,(1)和(2)之間的任何性能差異?請注意,我知道會有不同的初始化特性(如dlopen的開銷,第一次使用符號的開銷等),但在穩定狀態下,兩種選擇都同樣快,還是更快?
謝謝。
如果庫是編譯gcc -Wall -fPIC -O2
並用gcc -shared
鏈接的共享對象(即一些lib*.so
文件),則它是一個ELFPosition Independent Code共享庫。
PIC是在32位的x86哪位具有很少的登記冊─比在64位的x86-64哪位有一些尋址模式促進PIC
這是相同的(在穩定狀態)有點更昂貴性能明智,如果它是dlopen
-ed或者它是動態鏈接的。因爲在這兩種情況下,真正的鏈接都是由dynamic linker完成的(例如ld-linux.so
),正弦libdl.so
基本上是動態鏈接器的包裝。
重要的是,當被調用時性能明智的是lib*.so
內部的代碼,如果您連接它或不連接它,dlopen
也不會改變。
如果圖書館是靜態的鏈接的lib*.a
,情況可能會有所不同。你甚至可以編譯和鏈接既庫,並與近期GCC編譯的link time optimization能力計劃(編譯和鏈接與gcc -flto -Wall -O2
)
閱讀Drepper的How to Write Shared Library紙和Program Library HowTo和Levine's Linkers & Loaders書。
但是'dlopen'不是通過指針提供額外的間接層? –
不是w.r.t.一些共享庫(如'libc.so'),它也使用間接方式 –