как найти узкое место в ссылках? - PullRequest
3 голосов
/ 04 июля 2019

У меня есть проект, который очень медленно связывается (~ 2 минуты, и я чувствую, что это медленно). Мне известен более быстрый компоновщик, например gold или lld, но я не могу изменить компоновщик.

Я использовал много шаблонов C ++ 11 в своем коде, и я подозреваю, что некоторый код шаблона может неоднократно создаваться в нескольких объектных файлах, но я понятия не имею, как найти, правда ли это.

Интересно, есть ли способ профилировать всю стадию связывания, например, то, что мы делаем, чтобы профилировать программу и попытаться найти узкое место? Например, инструмент, который я могу использовать для проверки, сколько раз символ (излишне) появляется в разных объектных файлах и затем удаляется во время компоновки, это может помочь мне выяснить, какой код шаблона может быть причиной. Вышеприведенное о повторяющихся символах в объектных файлах - только мое предположение - Мне нужен подход, основанный на доказательствах. Затем, основываясь на этом выводе, я подумаю о том, как улучшить свой код, чтобы сократить время компоновки.

Я использую CMake, GNU g ++ и ld в качестве инструментов для сборки и работаю на платформе Linux.

Спасибо.

1 Ответ

0 голосов
/ 04 июля 2019

Один из способов решения этой проблемы - сбросить определенные символы каждого объектного файла и архива, включенного в ссылку с nm --demangle --defined-only --extern-only, и построить отображение {symbol, definition_count}.Сортируйте это отображение по definition_count по убыванию и напечатайте.

...