2015-10-12 32 views
4

我想優化具有超過200個依賴關係的庫的加載時間。我試圖使用可見性屬性隱藏符號,這導致我將出口符號的數量減少了30%。C++隱藏符號增加重定位時間

看着精靈直方圖,在優化後桶的數量保持不變,但成功和不成功的查找下降了很多。布隆過濾器的大小從8kb減少到4kb,但是比特數從19%增加到24%。

儘管加載時間增加了,我認爲這是由於在布隆過濾器中設置的比特數高於之前。

看着依賴關係,我可以看到大約有400.000個符號,它們在重定位的時候被看作是我的庫沒有成功。布隆過濾器用於過濾大部分數據,但由於位集數量較高(我在Internet上發現該公式:false positive = bitsets%^ 2),因此假陽性數量從3.6%增加到5.76%

優化前做一些數學我不得不搜索我的庫14.440誤報,優化後,這個數字上升到23.040。即使不成功的查找從1.7下降到1.1,比較的次數仍然高於以前。

我用calgrind測試了它,證實優化降低了庫的性能。圖書館本身的速度比以前快2%左右,但重定位時間大約高出1%(在ld strcmp調用中,從3575000增加到3617000)。

我還嘗試使用導出映射進一步減少導出符號的數量,該導出映射幫助我將導出符號的數量減少了50%。但它甚至更糟。桶的數量是一半,但不成功的查找將布隆過濾器大小提高到2kb,比特數爲29%,誤報率爲8.4%。

隱藏符號如何增加在重定位時完成的比較次數?如果布隆過濾器影響如此之多的結果,爲什麼鏈接器寧願減小其大小,而不是減少誤報的百分比?有沒有可以幫助我的鏈接器選項?

預先感謝您

+0

的布隆過濾器大小從8KB降低到4KB但設定的比特數從19%提高到24%....這是什麼意思?盛放過濾器的桶是否下降? – basav

+0

布隆過濾器是一個位集,其中鏈接器使用散列函數爲庫導出的每個符號設置2個位。它用於重定位(加載)時間,以瞭解符號是否在庫中定義(過濾器是概率性的:可能出現錯誤的肯定匹配,但錯誤否定則不可能)。過濾器越大,重新定位時使用的內存越大,但誤報數量越小。如果你有加載時間的限制,而且在重定位過程中沒有更好的存儲空間以及更大的過濾器和更小的誤報率。 – t0rtell0

回答

0

我一直在尋找到了一個媒體播放器應用程序類似較早前。

使用direct binding確實有助於縮短符號解析時間。

不確定布隆過濾器上隱藏符號的影響。

是否有任何鏈接器選項可以幫助我呢?

據我所知,沒有辦法調整符號查找中使用的布隆過濾器。

這裏有一些很好的文章,但沒有一篇強調調優bloom濾鏡。

bloom filter elf

cost of elf symbol