Настройка оптимизации visual studio
В этой статье предлагается ряд действий, которые можно попытаться выполнить, если среда Visual Studio работает медленно. Дополнительные рекомендации по повышению производительности можно найти в статье Советы и рекомендации по улучшению работы Visual Studio.
Обновление Visual Studio
Если сейчас вы используете более раннюю версию Visual Studio, например 2017 или 2019, скачайте бесплатно версию Visual Studio 2022, которая обеспечивает улучшенную производительность. В ней значительно ускорена загрузка решений и другие аспекты работы. Visual Studio можно установить на компьютер, на котором уже установлена более ранняя версия Visual Studio. Дополнительные сведения: Параллельная установка версий Visual Studio.
Если вы уже используете Visual Studio 2017, убедитесь, что у вас установлена как минимум версия 15.6. По данным тестирования, в версии 15.6 решения загружаются в два–три раза быстрее. Его можно скачать здесь. Дополнительные сведения см. в записи блога Load solutions faster with Visual Studio 2017 version 15.6 (Ускорение загрузки решений в Visual Studio 2017 версии 15.6).
Расширения и окна инструментов
У вас могут быть установлены расширения, замедляющие работу Visual Studio. Сведения об управлении расширениями с целью повышения производительности см. в разделе Изменение параметров расширений для повышения производительности.
Visual Studio также может работать медленнее из-за окон инструментов. Сведения об управлении окнами инструментов см. в разделе Изменение параметров окна инструментов для повышения производительности.
Оборудование
Если вы планируете обновление оборудования, имейте в виду, что твердотельный накопитель (SSD) сильнее влияет на производительность, чем дополнительный объем ОЗУ или ЦП с более высоким быстродействием.
Если вы добавляете диск SSD, то чтобы добиться оптимальной производительности, систему Windows следует установить на нем, а не на жестком диске (HDD). Где именно на диске находятся решения Visual Studio, не так важно.
Кроме того, не запускайте решение с USB-накопителя. Скопируйте его на жесткий диск или диск SSD.
Помогите нам улучшить службу
Рекомендации по повышению производительности Visual Studio предназначены для редких ситуаций, когда может возникать нехватка памяти. В таких случаях можно оптимизировать определенные компоненты Visual Studio, которые могут не использоваться. Приведенные ниже советы не следует рассматривать как общие рекомендации.
Если при работе с продуктом у вас возникают затруднения из-за проблем с памятью, свяжитесь с нами через средство обратной связи.
Использование 64-разрядной ОС
При переходе с 32-разрядной на 64-разрядную версию Windows вы увеличиваете объем виртуальной памяти, доступной Visual Studio, с 2 до 4 ГБ. Это позволяет Visual Studio обрабатывать значительно большие рабочие нагрузки даже несмотря на то, что это 32-разрядный процесс.
Visual Studio 2022 для Windows теперь является 64-разрядным приложением. Это означает, что вы можете открывать, изменять, запускать и отлаживать даже самые большие и сложные решения, не беспокоясь о нехватке памяти. Дополнительные сведения см. в записях блога, посвященных концепции Visual Studio 2022 и Visual Studio 2022, предварительная версия 1.
Отключение автоматического восстановления файлов
Visual Studio автоматически повторно открывает документы, открытые во время предыдущего сеанса. Это может увеличить время загрузки решения до 30 % или более в зависимости от типа проекта и открываемых документов. Конструкторы, например Windows Forms и XAML, и некоторые файлы JavaScript и typescript могут открываться медленно.
Visual Studio отображает уведомление на желтой панели, если автоматическое восстановление документа значительно замедляет загрузку решения. Вы можете отключить автоматическое повторное открытие файлов, выполнив следующие действия.
Выберите пункты меню Сервис > Параметры, чтобы открыть диалоговое окно Параметры.
На странице Проекты и решения > Общие отмените выбор пункта Повторно открыть документы при загрузке решения.
Если отключить автоматическое восстановление файлов, быстро перейти к нужным файлам можно с помощью одной из команд Перейти к:
Чтобы использовать общие функции Перейти к, выберите Изменить > Перейти к > Перейти ко всем или нажмите CTRL+T.
Перейдите к последней правке в решении, выбрав Изменить > Перейти к > Перейти к последнему изменению или нажав CTRL+SHIFT+BACKSPACE.
Используйте Перейти к последнему файлу, чтобы просмотреть список недавно просмотренных файлов в решении. Выберите Изменить > Перейти к > Перейти к последнему файлу или нажмите CTRL+1, CTRL+R.
Настройка параметров отладки
Если вы часто сталкиваетесь с нехваткой памяти во время сеансов отладки, можно оптимизировать производительность, внеся одно или несколько изменений в конфигурацию.
Включение функции "Только мой код"
Чтобы включить функцию Только мой код, выберите Сервис > Параметры > Отладка > Общие и затем Включить только мой код.
Указание символов для загрузки
При отладке машинного кода для загрузки файлов символов ( .pdb) требуется большой объем памяти. Вы можете настроить параметры отладочных символов для экономии памяти. Как правило, решение настраивается для загрузки только модулей из проекта.
Чтобы указать загрузку символов, выберите Сервис > Параметры > Отладка > Символы.
Задайте параметр Только указанные модули вместо Все модули и затем укажите, какие модули нужно загружать. Во время отладки также можно щелкнуть определенные модули правой кнопкой мыши в окне Модули, чтобы явно включить модуль в загрузку символов. (Чтобы открыть окно во время отладки, выберите Отладка > Окна > Модули.)
Дополнительные сведения см. в разделе Общие сведения о файлах символов.
Отключение средств диагностики
Рекомендуется отключить профилирование ЦП после использования. Эта функция может потреблять очень много ресурсов. После включения профилирования ЦП это состояние распространяется и на все последующие сеансы отладки, поэтому его следует отключать явным образом. Вы можете сэкономить ресурсы, отключив средства диагностики при отладке, если некоторые предоставляемые функции вам не нужны.
Для отключить Средства диагностики, запустите сеанс отладки, выберите Средства > Параметры > Отладка > Общие и снимите флажок Включить средства диагностики при отладке.
Дополнительные сведения см. в статье Средства профилирования.
Отключение инструментов и расширений
Для повышения производительности можно отключить некоторые инструменты или расширения.
Часто проблемы производительности можно выявить, отключая расширения по одному и проверяя уровень производительности.
Управляемые службы языка (Roslyn)
Сведения о производительности .NET Compiler Platform ("Roslyn") см. в статье Особенности производительности для крупных решений.
Отключение полного анализа решения
Отключение CodeLens
Visual Studio выполняет задачу Найти все ссылки для каждого метода при его отображении. CodeLens предоставляет такие функции, как встроенное отображение числа ссылок. Эта работа выполняется в отдельном процессе, например ServiceHub.RoslynCodeAnalysisService32. В крупных решениях или системах с небольшим объемом ресурсов эта функция может значительно снижать производительность. В случае возникновения проблем с памятью, например при загрузке большого решения на компьютере с 4 ГБ памяти или высокой загрузки ЦП при выполнении этого процесса, попробуйте отключить CodeLens для высвобождения ресурсов.
Чтобы отключить CodeLens, выберите Сервис > Параметры > Текстовый редактор > Все языки > CodeLens и отмените выбор данной функции.
Функция CodeLens доступна в выпусках Visual Studio Professional и Enterprise.
Другие инструменты и расширения
Отключение расширений
Расширения — это дополнительные программные компоненты в Visual Studio, которые предоставляют новые или расширяют имеющиеся функциональные возможности. Расширения часто могут выступать источником проблем с памятью. При возникновении подобных проблем попробуйте отключать расширения по одному за раз, чтобы оценить, как это влияет на сценарий или рабочий процесс.
Чтобы отключить расширения, перейдите в раздел Сервис > Расширения и обновления и отключите нужное расширение.
Чтобы отключить расширения, перейдите в меню Расширение > Управление расширениями и отключите нужное расширение.
Отключение режима карты
В режиме карты на полосе прокрутки показывается миниатюрное изображение строк кода. Режим карты включен по умолчанию.
Чтобы отключить режим карты, последовательно выберите Инструменты > Параметры > Текстовый редактор > Все языки > Полосы прокрутки, а затем в разделе Поведение снимите флажок Использовать режим карты для вертикальной полосы прокрутки.
Отключение переноса по словам
При включенном переносе по словам отображается часть длинной строки кода, выступающая за пределы текущей ширины окна редактора кода. Перенос по словам включен по умолчанию.
Чтобы отключить перенос по словам для проекта, над которым вы работаете в текущий момент, последовательно выберите в меню пункты Правка > Дополнительно > Перенос по словам. (Этот параметр можно переключать с помощью одних и тех же команд меню.)
Чтобы отключить перенос по словам для всех проектов, последовательно выберите в меню пункты Инструменты > Параметры > Общие > Текстовый редактор > Все языки > Общие, а затем в разделе Параметры снимите флажок Перенос по словам.
Отключение конструктора XAML
Конструктор XAML по умолчанию включен, но потребляет ресурсы только при открытии файла .xaml. Если вы работаете с XAML-файлами, но не хотите использовать функциональные возможности конструктора, отключите его, чтобы освободить память.
Чтобы отключить конструктор XAML, последовательно выберите в меню пункты Инструменты > Параметры > Конструктор XAML > Включить конструктор XAML, а затем снимите этот флажок.
Удаление рабочих нагрузок
Если вы не собираетесь использовать определенные рабочие нагрузки, удалите их с помощью установщика Visual Studio. Это позволяет оптимизировать расходы ресурсов при запуске и выполнении за счет пропуска ненужных пакетов и сборок.
Добавление неотслеживаемых файлов в локальный файл .gitignore
Visual Studio выполняет команду Git git status для неотслеживаемых файлов, чтобы вам было удобно добавлять новые файлы в репозиторий. При наличии большого количества неотслеживаемых файлов git status может потреблять большой объем памяти. Чтобы сделать эти файлы игнорируемыми и повысить производительность git status , можно добавить такие файлы или папки в локальный файл .gitignore. Чтобы получить доступ к файлу, выберите Git > Параметры > Параметры репозитория Git. Затем в разделе файлы Git щелкните Добавить, чтобы создать файл .gitignore, или щелкните изменить, если он у вас уже есть.
Функция фиксации графа в инструментах Git (только в Visual Studio 2022 Preview)
Новые возможности в Visual Studio 2022 Preview. Если при просмотре репозитория Git или журнала ветви в Visual Studio возникают задержки, вы можете воспользоваться новой функцией фиксации графа. Для этого скачайте Visual Studio 2022 Preview. Дополнительные сведения о функции фиксации графа см. в этой записи блога.
Принудительная сборка мусора
Среда CLR использует систему управления памятью, подразумевающую сборку мусора. В этой системе память иногда используется объектами, которые больше не нужны. Это временное состояние — сборщик мусора освободит эту память, основываясь на своей эвристике производительности и использования ресурсов. Вы можете заставить среду CLR собрать всю неиспользуемую память, используя сочетание клавиш в Visual Studio. Если имеется значительный объем мусора, ожидающего сборки, то принудительная сборка мусора позволяет снизить использование памяти процессом devenv.exe в диспетчере задач. Потребность в этом методе возникает довольно редко. Тем не менее после завершения операции, потребляющей много ресурсов (такой как полная сборка, сеанс отладки или событие открытия решения), он может помочь определить объем памяти, действительно используемый процессом. Так как среда Visual Studio является смешанной (управляемый и машинный код), собственный распределитель и сборщик мусора могут конкурировать за ограниченные ресурсы памяти. В условиях высокого использования памяти это может помочь принудительно запустить сборщик мусора.
Чтобы принудительно запустить сборку мусора, используйте сочетание клавиш: CTRL+ALT+SHIFT+F12, CTRL+ALT+SHIFT+F12 (нажмите два раза).
Если принудительная сборка мусора обеспечивает работоспособность сценария, направьте отчет с помощью средства обратной связи Visual Studio, так как подобное поведение, скорее всего, указывает на ошибку.
Подробное описание сборщика мусора CLR см. в статье Основы сборки мусора.
Оптимизируя исполняемый файл, можно добиться баланса между быстрым выполнением и небольшим размером кода. В этом разделе обсуждаются механизмы, предоставляемые Visual Studio для оптимизации кода.
Возможности языка
В следующих разделах описываются некоторые функции оптимизации в C/C++.
Прагмы и ключевые слова оптимизации
Список ключевых слов и прагм, которые можно использовать в коде для повышения производительности.
Параметры компилятора, упорядоченные по категориям
Список параметров компилятора /O, которые влияют на скорость выполнения или размер кода.
Декларатор ссылки rvalue: &&
Ссылки rvalue поддерживают реализацию семантики перемещения. Если для реализации библиотек шаблонов используется семантика перемещения, производительность приложений, использующих эти шаблоны, может значительно повыситься.
Прагма optimize
Если оптимизированный раздел кода вызывает ошибки или замедление, можно использовать прагму optimize, чтобы отключить оптимизацию для этого раздела.
Заключите код между двумя прагмами, как показано ниже:
Рекомендации по программированию
При компиляции кода с оптимизацией можно заметить дополнительные предупреждения. Такое поведение является ожидаемым, так как некоторые предупреждения относятся только к оптимизированному коду. Обращайте внимание на эти предупреждения, чтобы избежать многих проблем с оптимизацией.
Парадоксально, но оптимизация программы для ускорения может привести к снижению скорости выполнения кода. Это обусловлено тем, что некоторые оптимизации для скорости увеличивают размер кода. Например, функции встраивания устраняют издержки, вызванные вызовами функций. Однако встраивание слишком большого объема кода может сделать программу настолько большой, что число ошибок страниц виртуальной памяти увеличится. Таким образом, выигрыш в скорости, полученный при исключении вызовов функций, будет компенсирован обменом памятью.
В следующих разделах рассматриваются оптимальные методы программирования.
Рекомендации по оптимизации критичного по времени кода
Улучшенные методы программирования могут повысить производительность. В этом разделе предлагаются приемы программирования, которые помогут обеспечить удовлетворительную производительность критичного по времени кода.
Рекомендации по оптимизации
Общие рекомендации по эффективной оптимизации приложения.
Отладка оптимизированного кода
Поскольку оптимизация может изменить код, созданный компилятором, рекомендуется выполнить отладку приложения и оценить его производительность, а затем оптимизировать код.
В следующих разделах представлена информация о том, как отладить сборки выпуска.
В следующих разделах содержатся сведения о том, как оптимизировать сборку, загрузку и выполнение кода.
Рекомендации по повышению производительности Visual Studio предназначены для редких ситуаций, когда может возникать нехватка памяти. В таких случаях можно оптимизировать определенные компоненты Visual Studio, которые могут не использоваться. Приведенные ниже советы не следует рассматривать как общие рекомендации.
Если при работе с продуктом у вас возникают затруднения из-за проблем с памятью, свяжитесь с нами через средство обратной связи.
Использование 64-разрядной ОС
При переходе с 32-разрядной на 64-разрядную версию Windows вы увеличиваете объем виртуальной памяти, доступной Visual Studio, с 2 до 4 ГБ. Это позволяет Visual Studio обрабатывать значительно большие рабочие нагрузки даже несмотря на то, что это 32-разрядный процесс.
Visual Studio 2022 для Windows теперь является 64-разрядным приложением. Это означает, что вы можете открывать, изменять, запускать и отлаживать даже самые большие и сложные решения, не беспокоясь о нехватке памяти. Дополнительные сведения см. в записях блога, посвященных концепции Visual Studio 2022 и Visual Studio 2022, предварительная версия 1.
Отключение автоматического восстановления файлов
Visual Studio автоматически повторно открывает документы, открытые во время предыдущего сеанса. Это может увеличить время загрузки решения до 30 % или более в зависимости от типа проекта и открываемых документов. Конструкторы, например Windows Forms и XAML, и некоторые файлы JavaScript и typescript могут открываться медленно.
Visual Studio отображает уведомление на желтой панели, если автоматическое восстановление документа значительно замедляет загрузку решения. Вы можете отключить автоматическое повторное открытие файлов, выполнив следующие действия.
Выберите пункты меню Сервис > Параметры, чтобы открыть диалоговое окно Параметры.
На странице Проекты и решения > Общие отмените выбор пункта Повторно открыть документы при загрузке решения.
Если отключить автоматическое восстановление файлов, быстро перейти к нужным файлам можно с помощью одной из команд Перейти к:
Чтобы использовать общие функции Перейти к, выберите Изменить > Перейти к > Перейти ко всем или нажмите CTRL+T.
Перейдите к последней правке в решении, выбрав Изменить > Перейти к > Перейти к последнему изменению или нажав CTRL+SHIFT+BACKSPACE.
Используйте Перейти к последнему файлу, чтобы просмотреть список недавно просмотренных файлов в решении. Выберите Изменить > Перейти к > Перейти к последнему файлу или нажмите CTRL+1, CTRL+R.
Настройка параметров отладки
Если вы часто сталкиваетесь с нехваткой памяти во время сеансов отладки, можно оптимизировать производительность, внеся одно или несколько изменений в конфигурацию.
Включение функции "Только мой код"
Чтобы включить функцию Только мой код, выберите Сервис > Параметры > Отладка > Общие и затем Включить только мой код.
Указание символов для загрузки
При отладке машинного кода для загрузки файлов символов ( .pdb) требуется большой объем памяти. Вы можете настроить параметры отладочных символов для экономии памяти. Как правило, решение настраивается для загрузки только модулей из проекта.
Чтобы указать загрузку символов, выберите Сервис > Параметры > Отладка > Символы.
Задайте параметр Только указанные модули вместо Все модули и затем укажите, какие модули нужно загружать. Во время отладки также можно щелкнуть определенные модули правой кнопкой мыши в окне Модули, чтобы явно включить модуль в загрузку символов. (Чтобы открыть окно во время отладки, выберите Отладка > Окна > Модули.)
Дополнительные сведения см. в разделе Общие сведения о файлах символов.
Отключение средств диагностики
Рекомендуется отключить профилирование ЦП после использования. Эта функция может потреблять очень много ресурсов. После включения профилирования ЦП это состояние распространяется и на все последующие сеансы отладки, поэтому его следует отключать явным образом. Вы можете сэкономить ресурсы, отключив средства диагностики при отладке, если некоторые предоставляемые функции вам не нужны.
Для отключить Средства диагностики, запустите сеанс отладки, выберите Средства > Параметры > Отладка > Общие и снимите флажок Включить средства диагностики при отладке.
Дополнительные сведения см. в статье Средства профилирования.
Отключение инструментов и расширений
Для повышения производительности можно отключить некоторые инструменты или расширения.
Часто проблемы производительности можно выявить, отключая расширения по одному и проверяя уровень производительности.
Управляемые службы языка (Roslyn)
Сведения о производительности .NET Compiler Platform ("Roslyn") см. в статье Особенности производительности для крупных решений.
Отключение полного анализа решения
Отключение CodeLens
Visual Studio выполняет задачу Найти все ссылки для каждого метода при его отображении. CodeLens предоставляет такие функции, как встроенное отображение числа ссылок. Эта работа выполняется в отдельном процессе, например ServiceHub.RoslynCodeAnalysisService32. В крупных решениях или системах с небольшим объемом ресурсов эта функция может значительно снижать производительность. В случае возникновения проблем с памятью, например при загрузке большого решения на компьютере с 4 ГБ памяти или высокой загрузки ЦП при выполнении этого процесса, попробуйте отключить CodeLens для высвобождения ресурсов.
Чтобы отключить CodeLens, выберите Сервис > Параметры > Текстовый редактор > Все языки > CodeLens и отмените выбор данной функции.
Функция CodeLens доступна в выпусках Visual Studio Professional и Enterprise.
Другие инструменты и расширения
Отключение расширений
Расширения — это дополнительные программные компоненты в Visual Studio, которые предоставляют новые или расширяют имеющиеся функциональные возможности. Расширения часто могут выступать источником проблем с памятью. При возникновении подобных проблем попробуйте отключать расширения по одному за раз, чтобы оценить, как это влияет на сценарий или рабочий процесс.
Чтобы отключить расширения, перейдите в раздел Сервис > Расширения и обновления и отключите нужное расширение.
Чтобы отключить расширения, перейдите в меню Расширение > Управление расширениями и отключите нужное расширение.
Отключение режима карты
В режиме карты на полосе прокрутки показывается миниатюрное изображение строк кода. Режим карты включен по умолчанию.
Чтобы отключить режим карты, последовательно выберите Инструменты > Параметры > Текстовый редактор > Все языки > Полосы прокрутки, а затем в разделе Поведение снимите флажок Использовать режим карты для вертикальной полосы прокрутки.
Отключение переноса по словам
При включенном переносе по словам отображается часть длинной строки кода, выступающая за пределы текущей ширины окна редактора кода. Перенос по словам включен по умолчанию.
Чтобы отключить перенос по словам для проекта, над которым вы работаете в текущий момент, последовательно выберите в меню пункты Правка > Дополнительно > Перенос по словам. (Этот параметр можно переключать с помощью одних и тех же команд меню.)
Чтобы отключить перенос по словам для всех проектов, последовательно выберите в меню пункты Инструменты > Параметры > Общие > Текстовый редактор > Все языки > Общие, а затем в разделе Параметры снимите флажок Перенос по словам.
Отключение конструктора XAML
Конструктор XAML по умолчанию включен, но потребляет ресурсы только при открытии файла .xaml. Если вы работаете с XAML-файлами, но не хотите использовать функциональные возможности конструктора, отключите его, чтобы освободить память.
Чтобы отключить конструктор XAML, последовательно выберите в меню пункты Инструменты > Параметры > Конструктор XAML > Включить конструктор XAML, а затем снимите этот флажок.
Удаление рабочих нагрузок
Если вы не собираетесь использовать определенные рабочие нагрузки, удалите их с помощью установщика Visual Studio. Это позволяет оптимизировать расходы ресурсов при запуске и выполнении за счет пропуска ненужных пакетов и сборок.
Добавление неотслеживаемых файлов в локальный файл .gitignore
Visual Studio выполняет команду Git git status для неотслеживаемых файлов, чтобы вам было удобно добавлять новые файлы в репозиторий. При наличии большого количества неотслеживаемых файлов git status может потреблять большой объем памяти. Чтобы сделать эти файлы игнорируемыми и повысить производительность git status , можно добавить такие файлы или папки в локальный файл .gitignore. Чтобы получить доступ к файлу, выберите Git > Параметры > Параметры репозитория Git. Затем в разделе файлы Git щелкните Добавить, чтобы создать файл .gitignore, или щелкните изменить, если он у вас уже есть.
Функция фиксации графа в инструментах Git (только в Visual Studio 2022 Preview)
Новые возможности в Visual Studio 2022 Preview. Если при просмотре репозитория Git или журнала ветви в Visual Studio возникают задержки, вы можете воспользоваться новой функцией фиксации графа. Для этого скачайте Visual Studio 2022 Preview. Дополнительные сведения о функции фиксации графа см. в этой записи блога.
Принудительная сборка мусора
Среда CLR использует систему управления памятью, подразумевающую сборку мусора. В этой системе память иногда используется объектами, которые больше не нужны. Это временное состояние — сборщик мусора освободит эту память, основываясь на своей эвристике производительности и использования ресурсов. Вы можете заставить среду CLR собрать всю неиспользуемую память, используя сочетание клавиш в Visual Studio. Если имеется значительный объем мусора, ожидающего сборки, то принудительная сборка мусора позволяет снизить использование памяти процессом devenv.exe в диспетчере задач. Потребность в этом методе возникает довольно редко. Тем не менее после завершения операции, потребляющей много ресурсов (такой как полная сборка, сеанс отладки или событие открытия решения), он может помочь определить объем памяти, действительно используемый процессом. Так как среда Visual Studio является смешанной (управляемый и машинный код), собственный распределитель и сборщик мусора могут конкурировать за ограниченные ресурсы памяти. В условиях высокого использования памяти это может помочь принудительно запустить сборщик мусора.
Чтобы принудительно запустить сборку мусора, используйте сочетание клавиш: CTRL+ALT+SHIFT+F12, CTRL+ALT+SHIFT+F12 (нажмите два раза).
Если принудительная сборка мусора обеспечивает работоспособность сценария, направьте отчет с помощью средства обратной связи Visual Studio, так как подобное поведение, скорее всего, указывает на ошибку.
Подробное описание сборщика мусора CLR см. в статье Основы сборки мусора.
В этом документе описываются некоторые рекомендации по оптимизации программ C++ в Visual Studio.
Параметры компилятора и компоновщика
Профильная оптимизация
В Visual Studio поддерживается профильная оптимизация (PGO). Она использует данные профиля из обучающих выполнений инструментированной версии приложения для последующей оптимизации приложения. Использование профильной оптимизации может занимать много времени, поэтому к ней может обращаться не каждый разработчик, однако рекомендуется прибегать к такой оптимизации для окончательной сборки выпуска продукта. Дополнительные сведения см. в статье Профильные оптимизации.
Кроме того, были усовершенствованы оптимизации всей программы (создание кода во время компоновки) и оптимизации /O1 и /O2 . В целом приложение, скомпилированное с одним из этих параметров, будет работать быстрее, чем такое же приложение, скомпилированное с помощью более ранней версии компилятора.
Какой уровень оптимизации следует использовать
Если это возможно, окончательные сборки выпуска должны быть скомпилированы с помощью профильной оптимизации. Если выполнить сборку с помощью профильной оптимизации невозможно из-за недостаточной инфраструктуры для запуска инструментированных сборок или отсутствия доступа к сценариям, рекомендуется выполнить сборку с помощью оптимизации всей программы.
Параметр /Gy также очень полезен. Он создает отдельный COMDAT для каждой функции, предоставляя компоновщику большую гибкость при удалении COMDAT без ссылок и свертывания записей COMDAT. Единственный недостаток использования /Gy состоит в том, что он может приводить к возникновению проблем при отладке. Поэтому, как правило, его рекомендуется использовать. Дополнительные сведения см. в статье /Gy (включение компоновки на уровне функций).
Для связывания в 64-разрядных средах рекомендуется использовать параметр компоновщика /OPT:REF,ICF , а в 32-разрядных средах рекомендуется использовать /OPT:REF . Дополнительные сведения см. в статье Параметр /OPT (оптимизация).
Кроме того, настоятельно рекомендуется создавать отладочные символы даже в оптимизированных сборках выпусков. Это не влияет на созданный код и значительно упрощает отладку приложения.
Параметры с плавающей запятой
Параметр компилятора /Op был удален. Добавлены следующие четыре параметра компилятора для оптимизаций с плавающей запятой:
Параметр | Описание |
---|---|
/fp:precise | Это рекомендация по умолчанию, которую следует использовать в большинстве случаев. |
/fp:fast | Рекомендуется, если производительность имеет первостепенное значение, например в играх. При использовании этого параметра достигается максимальная производительность. |
/fp:strict | Рекомендуется, если требуются точные исключения для плавающей запятой и требуется поведение IEEE. При использовании этого параметра достигается минимальная производительность. |
/fp:except[-] | Его можно использовать вместе с /fp:strict или /fp:precise , но не с /fp:fast . |
declspecs оптимизации
В этом разделе мы рассмотрим два declspec, которые можно использовать в программах для повышения производительности: __declspec(restrict) и __declspec(noalias) .
declspec restrict можно применять только к объявлениям функций, которые возвращают указатель, например __declspec(restrict) void *malloc(size_t size); .
declspec restrict используется в функциях, возвращающих указатели без псевдонимов. Это ключевое слово применяется для реализации библиотеки времени выполнения C malloc , так как оно никогда не возвращает значение указателя, которое уже используется в текущей программе (если только вы не делаете что-то недопустимое, например используете память после того, как она была освобождена).
declspec restrict предоставляет компилятору больше сведений для выполнения оптимизации компилятора. Одной из самых трудных задач для компилятора является определение того, какие указатели являются псевдонимами других указателей, а эта информация значительно облегчает работу компилятора.
Стоит отметить, что это гарантированно предоставляемая информация, а не данные, которые компилятору нужно проверять. Если программа использует declspec restrict ненадлежащим образом, она может работать некорректно.
Для получения дополнительной информации см. restrict .
declspec noalias также применяется только к функциям и указывает, что функция является получистой. Получистая функция ссылается только на локальные переменные, аргументы и косвенные обращения первого уровня к аргументам, а также изменяет их. Этот declspec является обещанием для компилятора, и, если функция ссылается на глобальные переменные или косвенные обращения второго уровня к аргументам указателя, компилятор может создать код, который нарушает работу приложения.
Для получения дополнительной информации см. noalias .
Директивы pragma оптимизации
Эта директива pragma позволяет задать определенный уровень оптимизации для каждой функции. Она идеально подходит для тех редких случаев, когда приложение аварийно завершает работу при компиляции заданной функции с помощью оптимизации. Ее можно использовать для отключения оптимизации для одной функции:
Для получения дополнительной информации см. optimize .
Встраивание является одной из самых важных оптимизаций, выполняемых компилятором, поэтому мы поговорим о паре директив pragma, которые помогают изменить это поведение.
__restrict и __assume
В Visual Studio существует несколько ключевых слов, которые могут помочь повысить производительность: __restrict и __assume.
Во-первых, следует отметить, что __restrict и __declspec(restrict) — это две разные вещи. Несмотря на некоторую связь, эти ключевые слова имеют разную семантику. __restrict является квалификатором типа, как, например, const или volatile , но исключительно для типов указателей.
Указатель, который изменяется с помощью __restrict , называется указателем __restrict Указатель __restrict — это указатель, доступ к которому можно получить только с помощью указателя __restrict. Иными словами, нельзя использовать другой указатель для доступа к данным, на которые указывает указатель __restrict.
__restrict может быть мощным средством для оптимизатора Microsoft C++, но его следует использовать с большой осторожностью. При неправильном использовании оптимизатор может выполнить оптимизацию, которая приведет к нарушению работы приложения.
С помощью ключевого слова __assume разработчик может сообщить компилятору о необходимости допущений относительно значения определенной переменной.
Однако для __assume действуют некоторые ограничения. Во-первых, поскольку __restrict является всего лишь предложением, компилятор может игнорировать его. Кроме того, ключевое слово __assume сейчас работает только с переменными неравенствами для констант. Он не распространяет символьные неравенства, например, предположим (a < b).
Поддержка встроенных функций
Встроенные функции — это вызовы функций, когда компилятор обладает внутренними знаниями о вызове, и вместо вызова функции в библиотеке он выдает код для этой функции. Файл < заголовка Intrin. h >содержит все доступные встроенные функции для всех поддерживаемых аппаратных платформ.
Встроенные функции позволяют программисту более подробно изучать код без использования сборки. Использование встроенных функций имеет несколько преимуществ:
Код является более переносимым. Ряд встроенных функций доступен в нескольких архитектурах ЦП.
Код более удобен для чтения, так как он по-прежнему создается на C или C++.
Код получает преимущество оптимизаций компилятора. По мере повышения эффективности компилятора совершенствуется процесс создания кода для встроенных функций.
Дополнительные сведения см. в статье Встроенные функции компилятора.
Исключения
Поскольку использование исключений может приводить к снижению производительности, воспользуйтесь приведенными далее рекомендациями. Некоторые ограничения вводятся при использовании блоков try, которые не позволяют компилятору выполнять определенные оптимизации. На платформах x86 блоки try приводят к дополнительному снижению производительности из-за дополнительных сведений о состоянии, которые должны быть созданы во время выполнения кода. На 64-разрядных платформах блоки try не так сильно снижают производительность, но как только возникает исключение, процесс поиска обработчика и очистки стека может оказаться дорогостоящим.
Поэтому рекомендуется избегать добавления блоков try/catch в код, в котором они на самом деле не нужны. Если необходимо использовать исключения, по возможности используйте синхронные исключения. Дополнительные сведения см. в разделе Structured Exception Handling (C/C++).
Наконец, вызывайте исключения только в исключительных случаях. Использование исключений для общего потока управления, скорее всего, приведет к снижению производительности.
Читайте также: