Как улучшить производительность канала для большого приложения C++ в VS2005

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

24
задан Joel Coehoorn 9 December 2011 в 17:46
поделиться

13 ответов

Если Вы будете использовать /GL флаг для включения Целой оптимизации программы (WPO) или /LTCG , то флаг для включения Поколения Временного кода Ссылки, выключая их значительно улучшит времена ссылки, за счет некоторой оптимизации.

кроме того, если Вы используете /Z7 флаг для помещения отладочных символов в эти .obj файлы, статические библиотеки, вероятно, огромны. Используя /Zi для создания отдельный .pdb файлы могли бы помочь, если это препятствует тому, чтобы компоновщик читал все отладочные символы от диска. Я не уверен, помогает ли это на самом деле, потому что я не сравнил его.

19
ответ дан bk1e 28 November 2019 в 23:03
поделиться

можно попытаться смотреть на это: http://msdn.microsoft.com/en-us/library/9h3z1a69.aspx

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

1
ответ дан Evan Teran 28 November 2019 в 23:03
поделиться

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

фазой ссылки является, по крайней мере, первоначально, IO, связанный в загрузке всех объектных и библиотечных файлов. Вы могли бы быть в ситуации, где у Вас есть 60 библиотек наряду с основным проектом некоторого большого количества .obj файлов. Я подозреваю, что Вы просто могли бы видеть, по крайней мере, частично, типичное замедление окон в загрузке, все те освобождают и .obj файлы.

можно легко протестировать это. Возьмите все те библиотечные файлы и создайте один единственный библиотечный файл так же, как тест. Вместо того, чтобы связаться с 60 из них, свяжитесь с одним и посмотрите, куда Ваше время проходит. Это было бы интересно.

NTFS является известно медленным. Это shoudln't быть 7 м по сравнению с 32 секундами на медленном Linux, но это могла бы быть часть проблемы. Используя DLL поможет, но Вы перенесете время запуска приложения, хотя это не будет ранним как плохо. Я был бы уверен, что у Вас не будет времен запуска приложения на 7 м.

1
ответ дан Mark 28 November 2019 в 23:03
поделиться

Получите более быстрый компьютер с несколькими процессорами и включите параллельные сборки (это могло бы идти по умолчанию). Для разрешения самой большой суммы parallism удостоверьтесь, что зависимости проекта корректны, и у Вас нет ненужных зависимостей.

1
ответ дан Scott Langham 28 November 2019 в 23:03
поделиться

60 освобождает для соединения, действительно походит на ярмарку немногие. Это может быть чем-то вроде чрезвычайной меры, но она могла бы радикально ускорить вещи. Создайте новое решение, с несколькими проектами, и добавьте весь источник от своих существующих проектов до них. Тогда создайте и свяжите их вместо этого, и просто сохраните маленькие для тестирования.

1
ответ дан Scott Langham 28 November 2019 в 23:03
поделиться

Я испытал подобные затруднения при соединении крупных приложений с Visual C++ прежде. В моем случае у меня просто не было достаточного количества свободной RAM, и чрезмерная подкачка страниц к диску замедляла процесс соединения к останову. Удвоение моей RAM от 1 ГБ до 2 ГБ сделало поразительное улучшение. Сколько выполняет Ваше dev поле?

2
ответ дан James T 28 November 2019 в 23:03
поделиться

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

Одно обходное решение должно использовать Быстрая Сборка Решения Дополнение. Это могло бы включить внесение нескольких изменений в Вашу рабочую область, но выплата определенно стоящая того. Для коммерческого решения используйте Xoreax Incredibuild, который в основном включает эту ту же технологию, но добавляет другие опции также. Я приношу извинения, если я похожу на продавца для Incredibuild - я - просто очень удовлетворенный клиент.

2
ответ дан Matt Dillard 28 November 2019 в 23:03
поделиться

Я не думаю, преобразовывая в DLLs, было бы полезно. Вы могли попытаться искать опции сделать с оптимизацией и выключить их. Компоновщик мог бы проводить долгое время, просматривая освобождение для избыточного кода, который оно может устранить. Ваше приложение может закончиться больше или медленнее, но это не может быть проблемой Вам.

2
ответ дан Scott Langham 28 November 2019 в 23:03
поделиться

Обычно использование DLLs вместо статических библиотек улучшит соединение времен вполне немного.

5
ответ дан jmatthias 28 November 2019 в 23:03
поделиться

Смотрите на Incredibuild Xoreax. Его распределенная компиляция существенно уменьшила нашу полную сборку / времена ссылки около без 40 минут 8 минуты.

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

4
ответ дан Matt Dillard 28 November 2019 в 23:03
поделиться

Я только что узнал, что мы случайно определили большую таблицу строк в файле заголовка, который был включен практически во все (статические) библиотеки. (Я говорю об огромном проекте C ++.) Когда компоновщик создал EXE, это выглядит как объединение таблицы (в EXE оказывается только одна) или разбор библиотек длился вечно. Размещение таблицы в отдельном файле C ++ заняло пару минут ссылки на относительно медленном компьютере.

К сожалению, я не знаю, как найти подобные вещи, кроме как случайно.

2
ответ дан 28 November 2019 в 23:03
поделиться

Для отладочных сборок можно использовать инкрементное связывание, которое может значительно сократить время связывания.

К сожалению, есть определенные подводные камни, и VS2005 не предупредит вас.

  • Если при использовании статических библиотек инкрементное связывание не будет работать при изменении части файла для статической библиотеки. Решение состоит в том, чтобы установить для параметра компоновщика «Использовать входы зависимостей библиотеки» значение «Да» (это то же самое, что и Fast Solution Build в VS2003)

  • Если используется pragma-comment-lib для включения библиотеки DLL, и указывает относительный путь вместо одной библиотеки, то инкрементное связывание перестанет работать. Решение состоит в том, чтобы указать только библиотеку и использовать опцию компоновщика LIBPATH для добавления дополнительного пути к библиотеке.

  • Иногда. ilk будет поврежден (превысит 200 МБ), а затем внезапно инкрементный компоновщик займет более чем в 10 раз больше обычного времени. Иногда он будет жаловаться на повреждение файла .ilk, но обычно сначала через несколько минут. Решением для меня было настроить следующую команду для «Build Event» -> «Pre-Link Event»

    для %% f в ($ (IntDir) *. Ilk) do (if «%% ~ zf» GTR "200000000" (del %% f))

2
ответ дан 28 November 2019 в 23:03
поделиться

См. Мое предложение, сделанное в Microsoft: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=511300

Вы должны проголосовать за это! Вот мой последний комментарий по этому поводу:

Да, мы используем инкрементное связывание для сборки большинства наших проектов. Для самых крупных проектов это бесполезно. Фактически, для связывания этих проектов с помощью инкрементального связывания требуется больше времени (2 мин 50 по сравнению с 2 мин 44). Мы заметили, что это не работает, когда размер файлов ILK большой (наш самый большой проект генерирует примерно 262144 КБ в win 32).

Ниже я перечисляю другие вещи, которые мы пытались сократить время компоновки:

  • Явное создание экземпляров шаблона для уменьшения раздувания кода. Небольшой выигрыш.
  • IncrediLink (IncrediBuild дает интересный выигрыш для компиляции, но почти не дает выигрыша для ссылки).
  • Удаление отладочной информации для библиотек, которые редко отлаживаются (хороший прирост).
  • Удалите PDB-файл в «Pre-Build Event» (как ни странно, это дает интересный прирост, например: 2мин44 вместо 3мин34).
  • Преобразование многих статических параметров библиотека в DLL. Важное преимущество.
  • Работа с компьютером, оборудованным большим объемом оперативной памяти, чтобы максимально увеличить дисковый кэш. Самый большой выигрыш.
  • Большой объект vs маленький объект. Без разницы.
  • Измените параметры проекта (/ Ob1, / INCREMENTAL, Включить сворачивание COMDAT, Встраиваемый манифест и т. Д.). Некоторые дают интересную прибыль, другие нет. Мы стараемся постоянно максимизировать наши настройки.
  • Максимизировать внутреннюю связь по сравнению с внешней связью. Это хорошая практика программирования.
  • Отдельный программный компонент, насколько мы можем себе позволить. Вы можете быстро работать в модульном тесте по этой ссылке. Но нам все еще нужно взаимодействовать вместе, у нас есть унаследованный код, и мы работали со сторонним компонентом.
  • Используйте ключ секретного компоновщика / ожидаемый выход: 120000000. Небольшой выигрыш.

Обратите внимание, что на протяжении всех наших экспериментов мы тщательно измеряли время соединения. Медленное время соединения серьезно снижает производительность. Когда вы реализуете сложный алгоритм или отслеживаете сложную ошибку, вы хотите быстро повторить эту последовательность: изменить какой-то код, связать, отладить трассировку, изменить какой-то код, ссылку и т. Д.

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

В потоке https://blogs.msdn.microsoft.com/vcblog/2009/09/10/linker-throughput/ , Было сделано несколько интересных предложений по улучшению времени ссылки. На 64-битном компьютере почему бы не предложить возможность работы с файлом полностью в ОЗУ?

Опять же, приветствуются любые предложения, которые могут помочь нам сократить время компоновки.

10
ответ дан 28 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: