2012-05-08 43 views
1

我正在使用POSIX dlopen/dlsym API在運行時加載動態庫,然後通過名稱從這些庫調用函數。我應該緩存dlsym的返回值嗎?

在某處存儲dlsym的結果是一個好主意嗎?或者dlsym已經做了自己的緩存,並且會添加另一個圖層無用或者甚至是有害的?函數可能會被調用很多次,但我實際上並沒有辦法事先知道哪些函數或它們被調用的頻率。

謝謝!

+3

不成熟的優化是萬惡之源。 * * dlsym導致問題之前不要做任何事情。 – thiton

+0

我認爲你應該記住價值,但它與績效無關。設置代碼找出你需要的函數指針是很有意義的,稍後代碼會調用它們。 – ugoren

+0

@ugoren:可悲的是,我不提前知道哪些功能將被使用(我甚至不知道哪個庫他們將是未來)。 –

回答

3

dlsym函數不會執行任何緩存。它只是簡單地訪問ELF符號表(使用它的哈希表,這不是很好實現)。

我認爲你應該避免在同一個名字和庫上多次(例如數百萬次)調用dlsym

您可能會使用懶惰技巧:將例如名稱&庫在您的通話dlsym一起使用(在你的一些結構或類)與dlsym -ed函數指針,並調用dlsym只有當指針爲空。

你可能也想盡快趕上dlsym失敗。

FWIW,您可以撥打dlopendlsym很多次。尤其是,您可以在Linux上擁有許多數十萬個共享庫,如我的manydl.c示例所示。但是如果你仍然有一個活動的調用幀,那麼你應該避免使用dlclose。實際上,你可能永遠不會打電話給dlclose,你的程序仍然可以正常工作(有一個小的進程地址空間泄漏)。

相關問題