如何找出连接中的瓶颈?

3
我有一个项目,在链接时非常缓慢(约2分钟,我觉得这很慢)。我知道有更快的链接器,例如gold或lld,但我无法更改链接器。
我的代码中使用了许多C++11模板,我怀疑一些模板代码可能会在多个目标文件中重复实例化,但我不知道如何查找是否属实。
我想知道是否有一种方法可以像分析程序一样分析整个链接阶段,尝试找到瓶颈。例如,一个工具可以检查一个符号在不同的目标文件中出现了多少次(不必要地)并在链接时被丢弃,这可以帮助我找出哪些模板代码可能是原因。关于目标文件中重复的符号只是我的猜测 - 我需要一种基于证据的方法。然后根据这个发现,我将考虑如何改进我的代码以减少链接时间。
我使用CMake,GNU g++和ld作为我的构建工具,并在Linux平台上工作。
谢谢。

抱歉,关于工具的问题是不被允许的。不过你可能会发现 https://github.com/adrianstone55/SymbolSort 对你有用。 - Max Langhof
5
@MaxLanghof 询问工具推荐属于离题,但询问关于单个特定工具的具体帮助是可以的。 - Some programmer dude
1
减少链接时间的技术将会因编译器和链接器而异,并且通常会通过增加增量编译时间来换取减少链接时间。一些技术,例如显式模板实例化,也可能会影响开发/维护工作量。然而,两分钟的链接时间表明这是一个相当小的项目 - 只需利用它作为借口伸展一下双腿或者出去透透气,让眼睛远离屏幕重新聚焦。 - Peter
@Someprogrammerdude 是的,我应该在那里更加精确。 - Max Langhof
使用--trace并查看输出,了解输入文件的处理速度(以及处理顺序,特别是如果您有静态库)如何?这是一个好的开始。 - Vladislav Ivanishin
显示剩余5条评论
1个回答

0
一种解决这个问题的方法是使用 nm --demangle --defined-only --extern-only 命令转储链接中包含的每个目标文件和归档文件的定义符号,并构建一个映射 {symbol, definition_count}。将此映射按照 definition_count 从高到低排序并打印出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接