Как ускорить c ++ время соединения - PullRequest
13 голосов
/ 28 мая 2009

Есть ли способ оптимизировать время компоновки в MS Visual studio C ++ (2005)? Мы используем Xoreax Incredibuild для ускорения компиляции, но ничего для ссылки.

В настоящее время каждая ссылка занимает около 30 секунд. Когда я включаю инкрементное связывание, на это уходит 35-40 секунд. (Независимо от того, собираю ли я проект с и без incredibuild)

Есть ли способ, как профилировать компоновщик и смотреть сколько времени занимает? Или какой-нибудь инструмент для параллельного связывания? Или какие-нибудь советы по оптимизации кода для ускорения компоновщика?

Спасибо за ответ Людек Водичка


Edit:

Спасибо за первые ответы и дополнительную информацию:

  • Оптимизация всей программы и генерация кода связи уже выключены.
  • PIMPL идиома уже используется, когда это возможно
  • другие статические библиотеки уже включены через комментарий #pragma (lib, "pathToLib"). (также из-за простоты обслуживания)
  • HW: четырехъядерный процессор Q6600, оперативная память 8 ГБ, 3x WD raptor raid 0. Windows Vista, 64-битная

Ответы [ 4 ]

8 голосов
/ 28 мая 2009

Мне не известны какие-либо инструменты параллельного связывания; Я знаю, что Incredibuild не позволяет этого.

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

Затраты на связывание проектов через зависимости проекта также довольно высоки. Если вашей целевой платформой является только Win32 или, в первую очередь, вы можете использовать заголовок для связывания зависимых библиотек с помощью комментария #pragma (lib, "pathToLib").

7 голосов
/ 28 мая 2009

Если вы можете жить без оптимизации, отключите генерацию кода времени соединения (удалите переключатель / GL или в свойствах c / c ++ -> Оптимизация -> Оптимизация всей программы. Для компоновщика удалите / ltcg или используйте время ссылки Настройка генерации кода). Это замедлит работу компилятора, поскольку генерация кода теперь происходит во время компиляции.

Я видел проекты, создание которых с помощью / GL + / LTCG занимало часы, всего несколько секунд (например, этот: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/750ed2b0-0d51-48a3-bd9a-e8f4b544ded8)

2 голосов
/ 28 мая 2009

Рассматривали ли вы улучшение аппаратного обеспечения?
Используете ли вы отдельный физический жесткий диск для сборки? Какие диски вы используете?

В качестве общего предложения: добавьте немного памяти, получите Velociraptor , поместите только исходники и создайте каталог там, измерьте снова Если это поможет, рассмотрите RAID 0.

Я слышал сообщения о том, что обновление с ядра XP на ядро ​​W2K3 значительно улучшило время сборки, предположительно благодаря лучшему управлению памятью и кешированию.

В качестве предложения по изменению кода вы можете перенести некоторые функции в DLL и связать параллельно. Но я бы не стал вносить такие изменения, просто чтобы улучшить время сборки.

0 голосов
/ 07 октября 2009

Существуют некоторые общие рекомендации по настройке Улучшение времени соединения с IncrediBuild

Вы также можете пропустить привязку статических библиотек, где вы не будете их распространять, используя IncrediLink

Мы обнаружили, что добавление подписывающего шага пост-сборки не позволит IncrediBuild работать над следующими проектами, добавление комментария к пост-посту должно было помочь

rem IncrediBuild_AllowOverlap

См. IncrediBuild_AllowOverlap doc

...