Visual studio как оптимизировать код
Сразу скажу, что в финале мне удалось добиться сокращения времени компиляции решения с 4:24 минут до менее чем одной минуты. Детали под катом.
На старт!
В начале я собирался собрать отдельную тестовую машину с «чистой» ОС и одной лишь установленной программой — Visual Studio. Но потом решил, что тестировать сферических коней в вакууме будет не совсем верно. На компьютере программиста так или иначе будут установлены какой-нибудь браузер, антивирус, файловый менеджер, архиватор, текстовый редактор и т.д., а значит Студии придется работать со всем этим по близости. Значит, в таком режиме и будем её тестировать, на обычном компьютере разработчика (переустановив, правда, ради чистоты эксперимента, операционную систему и поставив свежие версии используемых в работе программ).
Набор экспериментов составлен по советом с сайтов Stackoverfow, RSDN, форумов MSDN, выдачи Google ну и просто из головы.
Объектом тестирования станет время полной компиляции решения. Перед каждым экспериментом вся папка проекта будет удаляться, код будет заново заливаться из репозитория, а Visual Studio перезагружаться. Каждый эксперимент будет повторяться трижды, результатом будет среднее время. После каждого эксперимента сделанные изменения откатываются.
Если кому-нибудь интересна аппаратная конфигурация моего компьютера, так вот она:
+ жесткий диск WD 500 Гб, 7200 RPM, 16 Мб кэш
+ Win 7 Профессиональная 32 бита со всеми возможными обновлениями
+ Visual Studio 2010 Professional с первым сервис-паком
В Windows включен режим максимальной производительности, отключен Aero и всякие анимации.
Исходное время компиляции моего решения: 4 минуты 24 секунды
Поехали!
Временные файлы — на RamDrive
Есть мнение, что самые медленные операции во время компиляции решения связаны с доступом к диску. Уменьшить это время можно путем использования RamDrive для временных файлов.
Результат: 4 минуты 13 секунд или -4.17% ко времени компиляции.
Вывод: прирост производительности имеется, хоть и небольшой. Если количество ОЗУ позволяет, этот совет можно применять в деле.
Весь проект — на RamDrive
Коль уж нам удалось немного ускорить компиляцию за счет выноса на RamDrive временных файлов, возможно получиться добиться еще лучших результатов, переместив туда всё решение (всё-таки более 4000 файлов).
Результат: 3 минуты 47 секунд или -14.02% ко времени компиляции.
Вывод: По началу этот эксперимент показался мне немного стрёмным — хранить исходники в оперативной памяти не лучший вариант (а вдруг пропадет питание?). Но, учитывая факт наличия бесперебойников, равно как и таких версий RamDrive, как от QSoft (с автоматическим дублированием измененных файлов с RamDrive на жесткий диск) убедили меня, что вариан возможен. Нужно только достаточно ОЗУ (и, по-хорошему, 64-битная ОС).
Весь проект — на флешку
Включение функции ReadyBoost в Windows
Microsoft расхваливает эту функцию именно за повышение производительности при работе с большим количеством относительно небольших блоков данных (наш вариант). Попробуем.
Результат: 4 минуты 17 секунд или -2.65% ко времени компиляции.
Вывод: вполне нормальный способ ускорения работы. Кроме необходимости 1 раз вставить флешку и настроить ReadyBoost других недостатков не имеет, а некоторый прирост производительности даёт.
Изменение количества одновременно компилирующихся проектов
Visual Studio при установке прописывает это число равным общему количеству ядер процессоров в Вашем ПК. Тем не менее, мы можем попробовать его изменить (делается это в настройках VS для С++ проектов) и оценить изменение производительности. Так как в моём компьютере 4-ядерный процессор, изначально это число было равным четырём.
Результат:
6 проектов компилируются одновременно — 4 минуты 34 секунды или +3.79% ко времени компиляции
2 проекта компилируется одновременно — 4 минуты 21 секунда или -1.14% ко времени компиляции
Вывод: я с самого начала ожидал, что увеличение числа одновременно компилирующихся проектов не даст никакого прироста производительности (так и вышло). Но вот почему уменьшение его до двух дало небольшой прирост для меня не очень понятно. Возможно, это просто статистическая погрешность, а может быть при компиляции 4-ех проектов Студия из-за их зависимостей теряет время на каком-то ожидании, что происходит реже при компиляции всего двух проектов. Если у кого-нибудь еще есть мысли по теме — прошу в комментарии.
Отключение вывода текста билда в окно Оutput
Меньше вывода текста при компиляции — быстрее результат.
Результат: 4 минуты 22 секунды или -0.76% ко времени компиляции
Вывод: прирост столь смехотворен, что не стоит даже комментариев. Он может быть как реальным, так и случайным.
Очистка корзины
Я вычитал этот совет на Stackoverflow. Аргументация была в том, что по ходу компиляции создаётся и удаляется масса мелких файлов, а процедура удаления в Windows работает медленнее при забитой корзине. Поскольку все предыдущие эксперименты я и так проводил при пустой корзине, мне пришлось проделать обратный эксперимент — положить в корзину 5000 файлов общим объёмом в 2 Гб.
Результат: 4 минуты 23 секунды или +0.38% ко времени компиляции.
Вывод: время компиляции осталось без изменений. Теория провалилась.
Ключ компилятора /MP
Ключ /MP — это тоже параллельная компиляция, но уже не проектов в решении, а файлов внутри каждого проекта.
Результат: 2 минуты 38 секунд или -40.15% ко времени компиляции
Вывод: это одно из самых существенных достижений среди всех поставленных экспериментов. Конечно, прирост столь высок в основном из-за 4-ядерности моего процессора, но вскоре такие (и еще более-ядерные процессоры) станут нормой в любом компьютере, так что включать опцию имеет смысл. При её включении компилятор честно предупреждает, что она не совместимо с ключом /Gm (Enable Minimal Rebuild), что вначале пугает — возникает мысль, что теперь при любом изменении любого файла будет происходить полная перекомпиляция решения. Так вот — нифига подобного! После изменения одного файла с кодом, как и ранее, будет перекомпилироваться только этот файл, а не всё решение. Всё, что делает ключ — это определяет выбор алгоритма определения взаимосвязей файлов кода и файлов заголовков в проекте (детальнее). Оба алгоритма неплохи и существенный прирост производительности от включения /MP во много раз превосходит недостатки от отключения /Gm.
Удаление папки решения из индекса поиска Windows
Есть мнение, что изменение файлов в папках, которые индексируются механизмом поиска ОС Windows, приводит к увеличению времени компиляции.
Результат: 4 минуты 24 секунды или никакого изменения во времени компиляции
Вывод: то ли индексирование в Windows сделано так хорошо, что вообще не замедляет работу других программ с диском, то ли это влияние минимально, то ли мне просто повезло и компиляция не совпала по времени с индексацией.
Unity Builds
Об этом механизме я рассказывал в прошлой статье.
Результат: 3 минуты 24 секунды или -22.73% ко времени компиляции.
Вывод: сокращение времени компиляции существенно. О всех достоинства и недостатках этой методики я уже писал, использовать его или нет Вы можете решить сами.
Завершение лишних программ
Работающие параллельно со Студией программы кушают память и ресурсы процессора. Их закрытие может положительно сказаться на скорости работы Студии. Итак, я закрываю Skype, QIP, Dropbox, GTalk, DownloadMaster, Mysql server.
Результат: 4 минуты 15 секунд или -3.41% ко времени компиляции
Вывод: во время компиляции придется обойтись без других программ. Никаких анекдотов и порнухи «пока оно там компилится». Вряд ли полный отказ от всех программ возможен для разработчика, но можно создать бат-файлы, включающие\выключащие все лишнее и иногда ими пользоваться.
Отключение антивируса
Если у Вас в системе установлен антивирус, то эта сволочь полезная программа постоянно проверяет все файловые операции. Таким образом, каждый участвующей в компиляции файл будет удостоен внимательного взгляда бдительного стража, что может замедлить время компиляции. Я, честно говоря, не был уверен, как настроить мой антивирус так, чтобы быть уверенным в полном игнорировании им моего проекта и попросту его удалил. Ваш антивирус, возможно, конфигурируется нужным образом.
Результат: 3 минуты 32 секунды или -19.07% ко времени компиляции
Вывод: удивительный результат. Я почему-то был уверен, что все эти *.cpp. *.h, *.obj файлы полностью антивирусом игнорируются и внимания удостоятся только скомпилированные исполняемые программы, что не очень сильно замедлит работу. Однако, факт налицо — почти минута времени экономии.
Дефрагментация жесткого диска
Файловые операции выполняются быстрее на дефрагментированом диске, а компиляция — это огромное количество файловых операций. Я специально оставил этот эксперимент напоследок, поскольку отменить дефрагментацию диска невозможно, а я хотел сделать эксперименты максимально независимыми.
Результат: 4 минуты 8 секунд или -6.06% ко времени компиляции
Вывод: практика согласуется с теорией. Поставьте себе дефрагментацию в планировщик и почаще.
Способы, которые, вероятно, помогли бы, но попробовать не вышло
Переход на 64-битную версию Windows
Есть предположение, что это дало бы некоторый прирост производительности, но портирование нашего проекта под x64, в силу его специфики, имеет не очень высокий приоритет и пока не реализовано. Соответственно, пока что нечего и тестировать.
Обновление процессора, памяти, замена HDD на SSD или RAID
Нужно сказать, что моя тестовая машинка не так уж плоха и до планового апгрейда еще далеко. Работаем с тем, что есть. По отзывам в интернете наибольшее влияние на время компиляции оказывает установка SSD.
Вынесение редко меняющихся проектов в отдельное решение
Это и так уже было сделано. Если в Вашем проекте подобное еще не реализовано — обязательно займитесь.
Xoreax's IncrediBuild или аналог
Распределение компиляции между компьютерами — это уже достаточно кардинальный шаг. Он требует покупки специального ПО, серьёзной настройки и некоторого «выворачивания наизнанку» процесса сборки. Но в очень больших проектах это может стать единственным возможным вариантом. На сайте Xoreax's IncrediBuild есть данные по приросту производительности, рассказы клиентов и куча другого спама разной полезной информации по теме.
Это всё, что я хотел рассказать о способах ускорения компиляции решений в Visual Studio, а в следующей статье я приведу несколько советов по ускорению работы самой IDE.
Оптимизируя исполняемый файл, можно добиться баланса между быстрым выполнением и небольшим размером кода. В этом разделе обсуждаются механизмы, предоставляемые Visual Studio для оптимизации кода.
Возможности языка
В следующих разделах описываются некоторые функции оптимизации в C/C++.
Прагмы и ключевые слова оптимизации
Список ключевых слов и прагм, которые можно использовать в коде для повышения производительности.
Параметры компилятора, упорядоченные по категориям
Список параметров компилятора /O, которые влияют на скорость выполнения или размер кода.
Декларатор ссылки rvalue: &&
Ссылки rvalue поддерживают реализацию семантики перемещения. Если для реализации библиотек шаблонов используется семантика перемещения, производительность приложений, использующих эти шаблоны, может значительно повыситься.
Прагма optimize
Если оптимизированный раздел кода вызывает ошибки или замедление, можно использовать прагму optimize, чтобы отключить оптимизацию для этого раздела.
Заключите код между двумя прагмами, как показано ниже:
Рекомендации по программированию
При компиляции кода с оптимизацией можно заметить дополнительные предупреждения. Такое поведение является ожидаемым, так как некоторые предупреждения относятся только к оптимизированному коду. Обращайте внимание на эти предупреждения, чтобы избежать многих проблем с оптимизацией.
Парадоксально, но оптимизация программы для ускорения может привести к снижению скорости выполнения кода. Это обусловлено тем, что некоторые оптимизации для скорости увеличивают размер кода. Например, функции встраивания устраняют издержки, вызванные вызовами функций. Однако встраивание слишком большого объема кода может сделать программу настолько большой, что число ошибок страниц виртуальной памяти увеличится. Таким образом, выигрыш в скорости, полученный при исключении вызовов функций, будет компенсирован обменом памятью.
В следующих разделах рассматриваются оптимальные методы программирования.
Рекомендации по оптимизации критичного по времени кода
Улучшенные методы программирования могут повысить производительность. В этом разделе предлагаются приемы программирования, которые помогут обеспечить удовлетворительную производительность критичного по времени кода.
Рекомендации по оптимизации
Общие рекомендации по эффективной оптимизации приложения.
Отладка оптимизированного кода
Поскольку оптимизация может изменить код, созданный компилятором, рекомендуется выполнить отладку приложения и оценить его производительность, а затем оптимизировать код.
В следующих разделах представлена информация о том, как отладить сборки выпуска.
В следующих разделах содержатся сведения о том, как оптимизировать сборку, загрузку и выполнение кода.
В этой статье приводятся советы, которые помогут вам сэкономить время, затрачиваемое на написание кода. Здесь вы найдете рекомендации по тому, с чего начать работу с Visual Studio, а также по написанию и отладке кода, обработке ошибок и использованию сочетаний клавиш.
Сведения о полезных сочетаниях клавиш см. в этой статье. Полный список команд с сочетаниями клавиш см. в статье Сочетания клавиш по умолчанию.
Начало работы
Вы можете значительно ускорить процесс работы с меню, выполнив быстрый поиск необходимых элементов, включая команды, настройки, документацию и параметры установки. В результатах поиска в Visual Studio будут отображаться сочетания клавиш для команд, которые вы сможете запомнить и использовать в дальнейшей работе.
Макетирование кода с использованием списка задач. Если вам не хватает требований для завершения фрагмента кода, воспользуйтесь окном "Список задач", которое позволяет отслеживать комментарии к коду, где используются маркеры, такие как TODO и HACK , или настраиваемые маркеры, а также управлять сочетаниями клавиш, с помощью которых можно перейти непосредственно к предварительно заданному месту в коде. Дополнительные сведения см. в статье Использование списка задач.
Использование сочетаний клавиш обозревателя решений. Если вы только начинаете знакомство с Visual Studio, изучите полезные сочетания клавиш, которые позволят ускорить работу с новой базой кода. Полный список сочетаний клавиш см. в статье Сочетания клавиш по умолчанию в Visual Studio.
Определение и настройка сочетаний клавиш в Visual Studio . Вы можете определить сочетания клавиш для команд Visual Studio, настроить эти сочетания клавиш и экспортировать их для других пользователей. Сочетания клавиш можно всегда найти и изменить в диалоговом окне "Параметры".
Использование специальных возможностей Visual Studio. Visual Studio имеет встроенные специальные возможности, совместимые со средствами чтения с экрана и другими специальными возможностями. Полный список доступных возможностей см. в статье Советы и рекомендации по специальным возможностям для Visual Studio.
Знакомство с жизненным циклом и обслуживанием продуктов Visual Studio. Дополнительные сведения о получении обновлений для Visual Studio, вариантах поддержки для пользователей версий Enterprise и Professional, поддержке прежних версий Visual Studio, а также компонентах, не включенных в программу обслуживания Visual Studio, см. в статье Жизненный цикл и обслуживание продуктов Visual Studio.
Установка пакетов NuGet и управление ими в Visual Studio. С помощью пользовательского интерфейса диспетчера пакетов NuGet в Visual Studio вы можете легко устанавливать, удалять и обновлять пакеты NuGet в проектах и решениях в ОС Windows. Дополнительные сведения см. в статье Установка пакетов в Visual Studio и управление ими с помощью диспетчера пакетов NuGet.
Написание кода
Следующие возможности позволяют быстрее разрабатывать код.
Используйте удобные команды. Visual Studio поддерживает разные команды, позволяющие быстрее выполнять стандартные задачи по редактированию кода. Например, вы можете вызвать команду быстрого дублирования строки кода. При этом вам не нужно копировать строку в буфер, перемещать курсор и выполнять вставку. Выберите Изменить > Дублировать или нажмите клавиши CTRL+E,V. Вы также можно быстро развернуть или свернуть выделенный текст с помощью пунктов меню Изменить > Дополнительно > Развернуть выделенный фрагмент или Изменить > Дополнительно > Сжать выделенный фрагмент или клавиш SHIFT+ALT+ = или SHIFT+ALT+ - .
Использование IntelliSense. При вводе кода в редакторе отображаются данные IntelliSense, например элементы списков, сведения о параметрах, краткие сведения, справка по сигнатурам и завершение слов. Эти возможности поддерживают нечеткое соответствие текста: например, результаты для списков членов включают не только элементы, которые начинаются с введенных символов, но и элементы, содержащие это сочетание символов где-либо внутри своих имен. Дополнительные сведения см. в статье Использование IntelliSense.
Изменение параметров автоматической вставки IntelliSense при вводе кода. Переключив IntelliSense в режим предложений, вы можете настроить IntelliSense таким образом, чтобы предлагаемые варианты вставлялись только в случае их явного выбора.
Чтобы включить режим предложений, нажмите клавиши CTRL+ALT+ПРОБЕЛ или в строке меню выберите Правка > IntelliSense > Переключить режим завершения.
Использование фрагментов кода. Вы можете использовать встроенные фрагменты кода или создавать собственные.
Чтобы вставить фрагмент, в строке меню выберите Правка > IntelliSense > Вставить фрагмент или Разместить во фрагменте либо в любом месте файла откройте контекстное меню и выберите Фрагмент > Вставить фрагмент или Разместить во фрагменте. Дополнительные сведения см. в статье Фрагменты кода.
Использование встроенных функций исправления ошибок в коде. Быстрые действия позволяют легко создавать и изменять код, а также выполнять его рефакторинг одним действием. Эти действия можно применять, используя значок отвертки , значок лампочки или сочетание клавиш ALT+ENTER или CTRL+ . когда курсор находится на подходящей строке кода. Дополнительные сведения см. в разделе Быстрые действия.
Отображение и изменение определений элементов кода. Вы можете быстро отобразить и изменить модуль, в котором определен элемент кода, например член, переменная или локальный объект.
Чтобы открыть определение во всплывающем окне, выделите элемент и нажмите клавиши ALT+F12 или откройте контекстное меню для этого элемента и выберите пункт Показать определение. Чтобы открыть определение в отдельном окне с кодом, откройте контекстное меню элемента кода, а затем выберите команду Перейти к определению.
Использование примеров приложений. Разработку приложений можно ускорить, скачав и установив примеры приложений из коллекции кода MSDN. Кроме того, вы можете изучить ту или иную технологию или концепцию программирования, загрузив и изучив пакет примеров для этой области.
Изменение отступов с использованием табуляции. Используйте настраиваемые параметры редактора для каждой базы кода, которые позволяют задавать единообразный стиль написания кода в сценариях, когда над одним проектом работает сразу несколько разработчиков, использующих разные редакторы и интегрированные среды разработки. Устанавливайте одинаковые соглашения об использовании языка и имен, а также правила форматирования, которых будет придерживаться вся команда разработчиков. Поскольку эти параметры переносятся вместе с кодом, заданные стили написания кода могут применяться даже за пределами среды Visual Studio. Дополнительные сведения см. в статье "Параметры", "Текстовый редактор", "Все языки", "Табуляция".
Перемещение по коду и интегрированной среде разработки
Существует множество способов быстрого поиска нужных мест в коде и перехода к этим местам. Также вы можете настроить схему размещения окон Visual Studio в соответствии с личными предпочтениями.
Создание закладок для строк кода. Для быстрого перехода к определенным строкам кода в файле можно использовать закладки.
Чтобы установить закладку, в строке меню выберите Правка > Закладки > Переключить закладку. Все закладки в решении можно просматривать в окне Закладки. Дополнительные сведения см. в разделе Установка закладок в коде.
Поиск определений символов в файле. Чтобы найти определения символов и имена файлов, можно выполнить поиск по решению, но результаты поиска не будут содержать пространств имен и локальных переменных.
Для доступа к этой возможности выберите в строке меню Правка > Перейти к.
Просмотр общей структуры кода. В обозревателе решений можно выполнять поиск и просматривать имеющиеся в проектах классы, их типы и члены. Можно также выполнять поиск символов, просматривать иерархию вызовов методов, находить ссылки на символы и выполнять другие задачи. Если выбрать элемент кода в обозревателе решений, связанный файл будет открыт на вкладке Предварительный просмотр, а курсор перемещен к элементу в файле. Дополнительные сведения см. в разделе Просмотр структуры кода.
Переход к заданному расположению в файле с использованием режима карты. В режиме карты показано миниатюрное изображение строк кода на полосе прокрутки. Дополнительные сведения об этом режиме отображения см. в статье Практическое руководство. Настройка полосы прокрутки.
Анализ структуры кода с использованием карты кода. Карты кода позволяют визуализировать зависимости в коде и проанализировать их согласованность, не просматривая все строки кода. Дополнительные сведения см. в статье Сопоставление зависимостей с картами кода.
Просмотр часто используемых файлов с использованием команды "Правка/Перейти к недавнему файлу" . Используйте команды перехода в Visual Studio для направленного поиска кода и быстрого обнаружения указанных элементов. Подробные инструкции см. в статье Поиск в коде с использованием команд перехода.
Перемещение окна свойств в правую часть экрана. Если вы предпочитаете более привычную схему размещения окон, переместите окно свойств Visual Studio с помощью клавиши F4.
Ускоренный поиск нужных элементов
В интегрированной среде разработки можно выполнять поиск нужных команд, файлов и параметров, а также фильтровать содержимое окна инструментов для отображения только информации, необходимой для текущей задачи.
Фильтрация содержимого окна инструментов. Вы можете выполнять поиск по содержимому различных окон инструментов, например Панель элементов, окно Свойства и Обозреватель решений, но отображать только те элементы, имена которых содержат искомые символы.
Отображение только тех ошибок, которые необходимо устранить. При нажатии кнопки Фильтр на панели инструментов Список ошибок можно уменьшить количество ошибок, отображаемых в окне Список ошибок. Можно отображать только ошибки в файлах, открытых в редакторе, только ошибки в текущем файле или только ошибки в текущем проекте. Кроме того, можно выполнять поиск в окне Список ошибок, чтобы находить конкретные ошибки.
Поиск диалоговых окон, команд меню, параметров и многого другого. В поле поиска введите ключевые слова или фразы, относящиеся к элементам, которые требуется найти. Например, при вводе запроса создать проект отображаются следующие результаты:
Панель Быстрый запуск, помимо прочего, содержит ссылки для создания проекта, добавления нового элемента в проект, а также ссылку на страницу Проекты и решения в диалоговом окне Параметры. Результаты поиска также могут содержать файлы проектов и окна инструментов.
Нажмите клавиши CTRL+Q, чтобы перейти сразу к полю поиска.
Отладка кода
Отладка может занимать немало времени, но следующие советы помогут ускорить процесс.
Использование средств отладки Visual Studio. В контексте Visual Studio отладка приложения обычно означает запуск приложения в режиме отладчика. В отладчике доступно множество способов наблюдения за выполнением кода. Для начала вы можете ознакомиться с рекомендациями, приведенными в статье Знакомство с отладчиком Visual Studio.
Тестирование одних и тех же страниц, приложений и сайтов в различных браузерах. В процессе отладки кода можно легко переключаться между установленными веб-браузерами, включая инспектор страниц (Visual Studio), без необходимости открытия диалогового окна Просмотр с помощью. С помощью списка Целевой объект отладки, расположенного на панели инструментов Стандартная рядом с кнопкой Начать отладку, можно быстро узнать, какой именно браузер используется для отладки и просмотра страниц.
Установка временных точек останова. Вы можете создать временную точку останова в текущей строке кода и одновременно запустить отладчик. При достижении этой строки кода отладчик входит в режим приостановки выполнения. Дополнительные сведения см. в статье Навигация по коду с помощью отладчика.
Для использования этой возможности нажмите сочетание клавиш CTRL+F10 или откройте контекстное меню строки кода, на которой требуется прервать выполнение, и выберите команду Выполнить до текущей позиции.
Перемещение точки выполнения во время отладки. Вы можете переместить текущую точку выполнения в другой раздел кода и перезапустить отладку с этой точки. Этим приемом удобно пользоваться, если необходимо выполнить отладку раздела кода без повторного создания всех шагов, необходимых для достижения этого раздела. Дополнительные сведения см. в статье Навигация по коду с помощью отладчика.
Чтобы переместить точку выполнения, перетащите желтую стрелку в место, где нужно задать следующий оператор в том же файле исходного кода, а затем нажмите F5, чтобы продолжить отладку.
Запись информации о значениях переменных. К переменной в коде можно добавить подсказу по данным и прикрепить ее, чтобы легко узнать последнее значение этой переменной после завершения отладки. Дополнительные сведения см. в статье Просмотр значений данных в подсказках по данным.
Для добавления подсказки по данным отладчик должен находиться в режиме приостановки. Поместите курсор на переменную, а затем нажмите кнопку закрепления в появившейся подсказке по данным. При остановке отладки в исходном файле рядом со строкой кода, которая содержит переменную, отображается значок синей булавки. При наведении указателя мыши на синюю булавку появляется значение переменной из последнего сеанса отладки.
Очистка окна интерпретации. Содержимое окна интерпретации можно очистить во время разработки, введя >cls или >Edit.ClearAll .
Дополнительные сведения о дополнительных командах см. в статье Псевдонимы команд Visual Studio.
Поиск изменений кода и других журналов с помощью CodeLens . CodeLens позволяет вам получать дополнительные сведения о коде, не отрываясь от работы и не выходя из редактора. Вы можете найти ссылки на фрагмент кода, изменения кода, связанные ошибки, рабочие элементы, проверки кода и модульные тесты.
Отладка в режиме реального времени совместно с другими разработчиками с использованием Live Share. Live Share позволяет редактировать и отлаживать код совместно с другими пользователями в реальном времени независимо от используемых вами языков программирования и создаваемых типов. Дополнительные сведения см. в статье Что такое Visual Studio Live Share?
Доступ к инструментам Visual Studio
Вы сможете быстро переходить к командной строке разработчика и другим инструментам Visual Studio, если закрепите их на начальном экране или на панели задач.
- В проводнике Windows перейдите к %ProgramData%\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools.
- В проводнике Windows перейдите к %ProgramData%\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools.
- Откройте контекстное меню командной строки разработчика, а затем выберите Закрепить на начальном экране или Закрепить на панели задач.
Управление файлами, панелями инструментов и окнами
В процессе разработки приложения можно одновременно работать в нескольких файлах кода и перемещаться между несколькими окнами инструментов. Чтобы держать все окна и инструменты в порядке, следуйте приведенным ниже советам.
Оставляйте файлы, которые используются часто, видимыми в редакторе. Можно закрепить файлы в левой части набора вкладок, чтобы они оставались видимыми независимо от того, сколько файлов открыто в редакторе.
Чтобы закрепить файл, выберите вкладку файла, а затем нажмите кнопку Закрепить/открепить.
Переместите документы и окна на другие мониторы. Если при разработке приложения используется несколько мониторов, можно более эффективно работать над отдельными частями приложения, перемещая открытые в редакторе файлы на другой монитор. Можно также перемещать окна инструментов, например окна отладчика, на другой монитор и закреплять окна документов вместе с окнами инструментов с помощью вкладок для создания блоков. Дополнительные сведения см. в статье Настройка макетов окон в Visual Studio.
Для более эффективного управления файлами можно создать новый экземпляр обозревателя решений и переместить его на другой монитор. Чтобы создать еще один экземпляр обозревателя решений, откройте контекстное меню в обозревателе решений и выберите команду Создать представление обозревателя решений.
Настройка шрифтов, отображаемых в Visual Studio. Вы можете изменять начертания, размеры и цвета шрифтов, используемых для текста в интегрированной среде разработки. Например, можно задать цвета определенных элементов кода в редакторе и начертание шрифта в отдельных окнах инструментов или во всей интегрированной среде разработки. Дополнительные сведения см. в разделе Практическое руководство. менять шрифты и цвета и Как менять шрифты и цвета в редакторе.
Проще всего выполнять отладку кода, когда он НЕ оптимизирован. Когда код оптимизирован, компилятор и среда выполнения вносят изменения в выпущенный код ЦП, поэтому он выполняется быстрее, но имеет не такое прямое сопоставление с начальным исходным кодом. Если сопоставление менее прямое, отладчикам часто не удается определить значения локальных переменных и пошаговое выполнение кода и точки останова могут не работать должным образом.
Дополнительные сведения о JIT-отладке см. в этой документации.
Как правило, конфигурация сборки "Выпуск" создает оптимизированный код, а конфигурация сборки "Отладка" — нет. Свойство MSBuild Optimize определяет, нужно ли компилятору оптимизировать код.
Параметр "Отключать JIT-оптимизацию при загрузке модуля (только управляемый код)"
Чтобы найти параметр Отключать JIT-оптимизацию при загрузке модуля (только управляемый код) , щелкните Сервис > Параметры, а затем выберите страницу Общие в узле Отладка.
Когда следует включить параметр "Отключать JIT-оптимизацию"?
Установите этот флажок, если вы скачали библиотеки DLL из другого источника, например пакета NuGet, и хотите отладить код в этой библиотеке DLL. Чтобы отключение вступило в силу, необходимо также найти файл символов (PDB) для этой библиотеки DLL.
Если вас интересует отладка только локально создаваемого кода, лучше оставить этот флажок снятым, так как в некоторых случаях включение этого параметра значительно замедляет отладку. Для этого имеются две причины.
- Оптимизированный код выполняется быстрее. Если вы отключаете оптимизацию для большей части кода, это может повлиять на производительность.
- Если включен только пользовательский код, отладчик даже не будет пытаться загружать символы для оптимизированных DLL. Поиск символов может занять много времени.
Ограничения для использования параметра "Отключать JIT-оптимизацию"
Существует две ситуации, когда включение этого параметра НЕ работает.
В ситуациях, когда вы присоединяете отладчик к уже выполняющемуся процессу, этот параметр не влияет на модули, которые уже были загружены во время подключения отладчика.
Задайте "COMPlus_ReadyToRun": "0" , добавив его в каждый профиль в файле Properties\launchSettings.json:
В этом документе описываются некоторые рекомендации по оптимизации программ 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++).
Наконец, вызывайте исключения только в исключительных случаях. Использование исключений для общего потока управления, скорее всего, приведет к снижению производительности.
Читайте также: