Почему компилятор VC ++ 2008 занимает слишком много времени на этапе компоновки? - PullRequest
0 голосов
/ 05 августа 2009

У меня есть автоматически сгенерированный код (около 18 000 строк, в основном упаковка данных) и другой около 2000 строк кода в проекте C ++. Проект включил операцию оптимизации времени соединения. / O2 и быстрая оптимизация кода. Для компиляции кода VC ++ 2008 express занимает невероятно много времени (около 1,5 часов). В конце концов, в нем всего 18 000 строк, почему компилятор занимает так много времени?

небольшое объяснение коду 18000. Это простой C, даже не C ++, который включает в себя множество распакованных циклов for, например:

a [0] .a1 = 0,1284; a [0] .a2 = 0,32186; a [0] .a3 = 0,48305; a [1] .a1 = 0,543; ..................

Это в основном заполнить сложную структуру. Но не так сложно для компилятора, я думаю.

Режим отладки быстрый, эта проблема есть только в режиме Relase. Прежде чем у меня есть 18 000 строк кода, они все в порядке. (в это время данные находятся во внешнем местоположении). Тем не менее, режим выпуска делает много работы, которые уменьшают размер exe с 1800kb до 700kb.

эта проблема возникает на этапе компоновки, поскольку генерируются все файлы .obj. У меня тоже есть подозрения на генерацию кода ссылки-времени, но я не могу понять, где что-то не так.

Ответы [ 4 ]

3 голосов
/ 05 августа 2009

На время соединения влияют несколько факторов, включая, но не ограничиваясь:

  • Скорость компьютера, особенно доступная память
  • Библиотеки включены в сборку.
  • Парадигма программирования - вы случайно используете повышение?

18 000 строк шаблонного метапрограммирования, компилируемого даже на новом четырехъядерном процессоре и 1,5 часа компоновки, меня совершенно не удивят.

2 голосов
/ 05 августа 2009

Исторически распространенной причиной медленных вычислений на C ++ является чрезмерное включение файла заголовка, как правило, из-за плохой модульности. Вы можете получить много избыточной компиляции, включив одинаковые большие заголовки во множество маленьких исходных файлов. Обычная ссылка в этих случаях - Лакос .

Вы не указываете, используете ли вы предварительно скомпилированный заголовок, который является быстрой и грязной заменой рефакторинга файла заголовка.

0 голосов
/ 26 октября 2010

Как сказано в одном из комментариев, вы, вероятно, включили Генерация временного кода ссылки (/LTCG), что переводит большую часть процесса генерации и оптимизации кода на стадию соединения.

Это дает возможность удивительной оптимизации, но также значительно увеличивает время соединения.

Команда C ++ говорит, что значительно оптимизировал компоновщик для VS 2010 .

0 голосов
/ 05 августа 2009

Именно поэтому мы генерируем много DLL для наших отладочных сборок, но обычно связываем их для наших сборок релиза. Проще (для наших конкретных целей) иметь дело с большим количеством монолитных исполняемых файлов, но для связывания требуется много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...