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

标签 c++ optimization visibility symbols elf

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

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

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

查看依赖项,我可以看到大约有 400.000 个符号在重定位时没有成功地查看我的库。布隆过滤器用于过滤其中的大部分,但由于位集的数量较多,误报的数量从 3.6% 增加到 5.76%(我在互联网上找到这个公式:误报=bitsets%^2)

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

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

我还尝试使用导出 map 进一步减少导出符号的数量,该 map 帮助我将导出符号的数量减少了 50%。但情况更糟。桶的数量是一半,但不成功的查找增加到 1.4,布隆过滤器大小为 2kb,比特集为 29%,误报率为 8.4%。

隐藏符号怎么可能增加重定位时进行的比较次数?如果布隆过滤器对结果的影响如此之大,为什么链接器更愿意减小其大小而不是降低误报率?是否有任何链接器选项可以帮助我解决这个问题?

提前致谢

最佳答案

前段时间我正在研究类似的媒体播放器应用程序。

使用直接绑定(bind)确实有助于减少符号解析时间。

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

Is there any linker option that can help me in this?

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

那里有一些不错的文章,但没有一篇强调调优布隆过滤器。

bloom filter elf

cost of elf symbol

关于C++ 隐藏符号增加重定位时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083962/

相关文章:

c++ - 我如何使用 for 循环中的 set 将输入分配给 map 函数

c++ - 错误 C2440 : 'type cast' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'DWORD'

mysql - SQL select语句优化(id,parent_id,child_ids)

css - 如何使用 CSS 隐藏和显示单独的 div

javascript - 滚动时使元素可见

函数内部的 Python 全局关键字可见性

c++ - OpenGL c++ 纹理有错误的颜色和位置

c++ - 双模板函数重载失败

c# - 如何防止 JIT 编译器优化此方法

c# - for 循环优化 - 需要还是不需要?