C ++隐藏符号会增加重定位时间

时间:2015-10-12 14:43:54

标签: c++ optimization visibility symbols elf

我正在尝试优化具有200多个依赖项的库的加载时间。我尝试使用可见性属性隐藏符号,这使我将导出符号的数量减少了30%。

查看精灵直方图,优化后桶的数量保持不变,但成功和不成功的查找减少了很多。布隆过滤器的大小从8kb减少到4kb,但设置的位数从19%增加到24%。

尽管加载时间增加了,我认为这是由于布隆过滤器中设置的位数比之前更高。

查看依赖关系,我可以看到有大约400,000个符号在重定位时被查看到我的库但没有成功。 Bloom过滤器用于过滤大部分过滤器,但由于比特数较多(我在​​互联网上发现了这个公式:假阳性= bitsets%^ 2),误报的数量从3.6%增加到5,76%

在优化之前做一些数学我必须搜索我的库14.440误报,并且在优化之后这个数字上升到23.040。即使不成功的查找从1.7减少到1.1,比较的数量仍然比以前更高。

我还使用calgrind对其进行了测试,确认优化降低了库的性能。该库本身比以前快2%左右,但重定位时间高出约1%(在ld strcmp调用中从3575000上升到3617000)。

我还尝试使用导出地图进一步减少导出符号的数量,这有助于我将导出符号的数量减少50%。但它甚至是最糟糕的。桶的数量是一半,但不成功的查找将Bloom过滤器大小增加到1.4kk,比特集为29%,误报率为8.4%。

隐藏符号如何增加重定位时间的比较次数?如果布隆过滤器对结果产生如此大的影响,为什么链接器更愿意减小其大小而不是减少误报率?是否有任何链接器选项可以帮助我?

提前谢谢

1 个答案:

答案 0 :(得分:0)

前一段时间我正在为媒体播放器应用寻找类似的东西。

使用direct binding确实有助于缩短符号解析时间。

不确定隐藏符号对布隆过滤器的影响。

  

是否有任何链接器选项可以帮助我?

据我所知,没有办法调整符号查找中使用的布隆过滤器。

有一些好文章,但没有一篇强调调整布隆过滤器。

bloom filter elf

cost of elf symbol