Почему мои сборки Visual C ++ 2008 x64 в 5 раз медленнее, чем сборки x86?

Я пытался сократить время сборки своего продукта. Мы используем непрерывную интеграцию, и выполнение наших сборок теперь занимает 2 часа.

Я посмотрел на тайминги NANT и увидел множество мест, которые работают медленнее, чем они должны быть, но одно из них - это сборки x64 наших проектов Visual C ++. Вот пример таймингов по сравнению со сборками x86 с тем же кодом:

Выпуск Win32: 8 '49 "Выпуск x64: 41' 8"

x64 примерно в 5 раз медленнее. Опять же, это для того же самого кода.

Кто-нибудь еще сталкивался с таким несоответствием времени сборки между x86 и x64? Есть предложения по устранению разрыва?

ПРИМЕЧАНИЕ: мне известны инструменты для повышения производительности сборки в целом, такие как распределенные сборки Xoreax и параллельные сборки TeamCity, и я собираюсь исследовать и те, и другие, но я не могу не чувствовать, что должен быть какой-то способ получить x64 возвращается в строй, не прибегая к сторонним инструментам.


person anelson    schedule 30.10.2009    source источник


Ответы (2)


Убедитесь, что настройки сборки проекта одинаковы для обоих. Когда вы выбираете x64, VS в основном загружает новые настройки проекта, и они могут сильно отличаться. Например, проверьте, включена ли добавочная сборка в x64.

person Henri    schedule 30.10.2009
comment
Хорошее предложение, но я это уже проверил. Инкрементное связывание отключено для обоих, чтобы поддерживать оптимизацию всей программы и генерацию кода во время компоновки, которые IIRC несовместимы с инкрементным связыванием. В любом случае наши сборки начинаются с чистого дерева исходных кодов, поэтому инкрементное связывание, насколько я понимаю, не дает большого улучшения производительности. - person anelson; 31.10.2009
comment
Я присмотрелся и обнаружил, что я отключил предварительно скомпилированные заголовки для конфигурации x64, когда мы использовали VS 2k5, и никогда не включал его снова, когда мы обновились до 2k8. Теперь время сборки намного более разумное. - person anelson; 02.11.2009

Не знаю, но не удивлюсь, если весь генератор кода будет переписан для x64. Если вы выполните тестовую сборку и используете проводник процессов для просмотра библиотек DLL, которые извлекает компилятор, вы сможете увидеть, использует ли компилятор совершенно разные двоичные файлы при сборке для двух разных целей. Вы можете обнаружить, что серверная часть x64 - это управляемое приложение .NET, а приложение x86 - родное приложение старой школы. Просто предположение. Наверное, неправда. Вы можете исследовать использование ЦП / диска / ОЗУ этими двумя, пока у вас запущен проводник процессов.

person Andrew Bainbridge    schedule 30.10.2009