2017-07-29 60 views
0

我有一个很大的C++项目(g ++/linux),其中构建系统将生成的代码按深度= 1的目录名组合到.so文件中哪个链接更快?许多小的.so文件或几个大的.so文件?

这会导致出现几个问题为了释放更小的块,所以我试图让它更细化,即深度= 5,这会增加.so文件的数量(减少5倍,20到100),但允许我们进行更改和部署级别

在干净的构建过程中,当所有东西都是从头开始构建的时候,是否有很多小的.so文件会影响链接时间?

+0

你试过了吗?这可能会从项目到项目有所不同。我认为这个问题有点过于宽泛。但是,如果我猜测,我可能会认为它会变慢。 – tambre

+0

我正在尝试。粒度版本的优势大于编译时间的增加,但代码已经花费了一个多小时才能完全在具有64GB RAM的40核心计算机上构建 – zrb

+0

dll粒度的标准应该是可执行文件之间的机器代码共享。如果您在构建时间上挣扎,那么您应该检查代码的组织并构建时间。这整个故事听起来像你只是用一个写得不好的代码,无缘无故地发出成千上万的翻译单元。 – VTT

回答

1

这是关于GNU/Linux吗?动态链接是目前非常慢,因为相关性排序使用一种算法是大约Øñ³)或左右:

我们应该真正解决这个问题,但它有尚未发生。 (有些人担心在依赖图中有周期时会改变排序顺序,这就是为什么它很困难。)如果你只有几十个共享对象,你不会看到加载时间的影响,但它可能是一个问题,如果你有100个或更多的。

关于您关于链接编辑器性能的原始问题:ELF的一个令人好奇的方面是,您可以链接一个不包含任何符号的虚拟DSO,并在运行时用适当的DSO代替-Wl,--unresolved-symbols=ignore-all, DSO复制到您需要依赖关系的所有sonames。这个技巧可以让你将大多数东西并行连接起来,忽略运行时依赖关系。对于生产版本来说,这可能不是一个好主意,尤其是在使用懒惰绑定的情况下,但在开发过程中,这可能会有所帮助。有了这种改变,将事物分解成许多小型的DSO可能是不值得的(但这实际上取决于你正在处理的库大小)。

另外请记住,DSO的部分升级可能会非常痛苦,并且一旦您的用户这样做了,您就需要谨慎管理依赖关系并保持整个系统的ABI兼容性。对于小型DSO,您还必须更经常地处理将符号定义从一个DSO移到另一个DSO,如果您使用符号版本,可能会遇到奇怪的障碍。