1
我正在使用POSIX dlopen
/dlsym
API在運行時加載動態庫,然後通過名稱從這些庫調用函數。我應該緩存dlsym的返回值嗎?
在某處存儲dlsym
的結果是一個好主意嗎?或者dlsym已經做了自己的緩存,並且會添加另一個圖層無用或者甚至是有害的?函數可能會被調用很多次,但我實際上並沒有辦法事先知道哪些函數或它們被調用的頻率。
謝謝!
我正在使用POSIX dlopen
/dlsym
API在運行時加載動態庫,然後通過名稱從這些庫調用函數。我應該緩存dlsym的返回值嗎?
在某處存儲dlsym
的結果是一個好主意嗎?或者dlsym已經做了自己的緩存,並且會添加另一個圖層無用或者甚至是有害的?函數可能會被調用很多次,但我實際上並沒有辦法事先知道哪些函數或它們被調用的頻率。
謝謝!
dlsym
函數不會執行任何緩存。它只是簡單地訪問ELF符號表(使用它的哈希表,這不是很好實現)。
我認爲你應該避免在同一個名字和庫上多次(例如數百萬次)調用dlsym
。
您可能會使用懶惰技巧:將例如名稱&庫在您的通話dlsym
一起使用(在你的一些結構或類)與dlsym
-ed函數指針,並調用dlsym
只有當指針爲空。
你可能也想盡快趕上dlsym
失敗。
FWIW,您可以撥打dlopen
和dlsym
很多次。尤其是,您可以在Linux上擁有許多數十萬個共享庫,如我的manydl.c示例所示。但是如果你仍然有一個活動的調用幀,那麼你應該避免使用dlclose
。實際上,你可能永遠不會打電話給dlclose
,你的程序仍然可以正常工作(有一個小的進程地址空間泄漏)。
不成熟的優化是萬惡之源。 * * dlsym導致問題之前不要做任何事情。 – thiton
我認爲你應該記住價值,但它與績效無關。設置代碼找出你需要的函數指針是很有意義的,稍後代碼會調用它們。 – ugoren
@ugoren:可悲的是,我不提前知道哪些功能將被使用(我甚至不知道哪個庫他們將是未來)。 –