Как посмотреть скорость выполнения кода в visual studio

Обновлено: 02.07.2024

System. Diagnostics

Простой пример использования Stopwatch

Для начала, рассмотрим простой пример использования класса Stopwatch для измерения затраченного времени на выполнение операции.

  1. Создать объект класса Stopwatch ;
  2. Выполнить метод Start() для того, чтобы засечь время начала операции;
  3. Выполнить метод Stop() для того, чтобы засечь время окончания операции;
  4. Воспользоваться одним из свойств объекта для получения данных о затраченном на выполнение операции времени.

В примере использовано свойство ElapsedMilliseconds , которое позволяет получить количество миллисекунд, затраченных на выполнение операции. Рассмотрим какие ещё есть свойства и методы у класса Stopwatch .

Stopwatch

Свойства Stopwatch

Elapsed

Свойство Elapsed позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch . Описание свойства выглядит следующим образом:

ElapsedMilliseconds

Свойство ElapsedMilliseconds позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch в миллисекундах. В примере использования класса Stopwatch выше продемонстрировано использование этого свойства.

Elapsed Ticks

Свойство Elapsed Ticks позволяет получить общее время выполнение операции в тактах таймера, измеренное текущим экземпляром Stopwatch . Такт — это наименьшая единица времени, которую Stopwatch может измерять таймер. В следующем примере показано использование свойства Elapsed Ticks для измерения времени, затраченного на преобразование строки в целое число типа int .

Результатом выполнения этого кода может быть вот такой вывод консоли:

Is Running

Свойство IsRunning позволяет получить значение типа bool , указывающее на то запущен ли в данный момент таймер Stopwatch .

Поля Stopwatch

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

Frequency

Поле Frequency содержит частоту таймера в виде количества тактов в секунду.

Это поле удобно использовать вместе со свойством Elapsed Ticks для преобразования количества тактов в секунды. Например,

Is High Resolution

Свойство Is High Resolution указывает, зависит ли таймер Stopwatch от счетчика производительности высокого разрешения ( true ) или же использует класс DateTime ( false ).

Пример использования поля

Вывод консоли будет иметь следующий вид:

Операции рассчитываются с использованием системного счетчика производительности с высоким разрешением.

Частота таймера = 10000000

Таймер работает с точностью до 100 наносекунд

Методы Stopwatch

Start и Stop

Start New

Reset

Restart

Метод Restart() останавливает измерение интервала времени, обнуляет затраченное время и повторно запускает таймер. Таким образом, предыдущий пример можно переписать следующим образом:

Итого

Я хотел бы проверить, как быстро работает моя функция проектов. Было бы здорово, если бы была возможность отмечать медленные места моей функции, чтобы я мог изменить свой код для повышения производительности. Я использую Microsoft Visual Studio 2012, и я знаю, что есть встроенный инструмент тестирования, но я действительно не знаю, где его найти и, вероятно, как его использовать. Было бы здорово, если бы кто-то мог помочь мне с этой проблемой.

для тестирования метода excecution время вы можете использовать Секундомер Класс.

также есть встроенный профилировщик в VS 2013 в разделе Анализ = > меню профилировщика. Я не помню, в какой версии VS он был добавлен, но я думаю, что он есть в VS 2012. Таким образом, вы можете начать профилирование, некоторое время использовать приложение, а затем проверить, какие операции заняли больше времени.

обновление: VS 2017 теперь показывает время выполнения в миллисекундах для каждой строки или когда Выполнить Команду используется во время сеанса отладки:

В Visual Studio 2013

в верхнем меню выберите ANALYZE -> Performance and Diagnostics

Проверьте мастер производительности, чтобы рассчитать необходимое время. нажать пуск. Теперь выберите-Instrumentation для измерения вызовов функций и подсчета. Нажимать далее. Выберите-будет показан один или несколько доступных проектов с таким именем проекта. Нажимать далее. Снова нажмите кнопку Далее. Проверить - запустить профилирование после завершения работы мастера. Теперь нажмите кнопку Готово.

В Visual Studio 2017

в верхнем меню выберите ANALYZE -> Performance Profiler

Проверьте мастер производительности, чтобы рассчитать необходимое время. нажать пуск. Теперь выберите-Instrumentation для измерения вызовов функций и подсчета. Нажимать далее. Выберите-будет показан один или несколько доступных проектов с таким именем проекта. Нажимать далее. Снова нажмите кнопку Далее. Проверить - запустить профилирование после завершения работы мастера. Теперь нажмите кнопку Готово.

если у вас возникли проблемы с использованием мастера производительности в Windows 10, см.:метод выборки процессора отключен в профилировщике производительности.

вы найдете мастер производительности в меню анализ, если у вас есть достаточно хорошая версия Visual Studio (Professional?).

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

в Visual Studio содержит много хороших встроенных инструментов для профилирования, и многие другие доступны в виде плагинов (также бесплатно).

Сегодня мы будем замерять производительность нашего приложения с помощью Visual Studio Profiling Tool.

Visual Studio Profiling Tool позволяет разработчикам измерять, оценивать производительность приложения и кода. Эти инструменты полностью встроены в IDE, чтобы предоставить разработчику беспрерывный контроль.
В этом руководстве мы по шагам профилируем приложение PeopleTrax используя Sampling и Instrumentation методы профилирования, чтобы выявить проблемы в производительности приложения.

image

Подготовка

Методы профилирования

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

Sampling

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

Каждый определенный интервал времени собирается информация о стеке вызовов (call stack). На основе этих данные производится подсчет производительности. Используется для первоначального профилирования и для определения проблем связанных с использование процессора.

Instrumentation

Instrumentation — собирает детализированную информацию о времени работы каждой вызванной функции. Используется для замера производительности операций ввода/вывода.

Метод внедряет свой код в двоичный файл, который фиксирует информацию о синхронизации (времени) для каждой функции в файл, и для каждой функции которые вызываются в этой.

  • Elapsed Inclusive — общее время, затраченное на выполнение функции
  • Application Inclusive — время, затраченное на выполнение функции, за исключением времени обращений к операционной системе.
  • Elapsed Exclusive — время, затраченное на выполнение кода в теле. Время, которое тратят функции, вызванные целевой функцией.
  • Application Exclusive — время, затраченное на выполнение кода в теле. Исключается время, которое тратится выполнения вызовов операционной системы и время, затраченное на выполнение функций, вызванные целевой функцией.
Concurrency

Concurrency – собирает информацию о многопоточных приложения (как отлаживать многопоточные приложения см. «Руководство по отладке многопоточных приложений в Visual Studio 2010»). Метод собирает подробную информацию о стеке вызовов, каждый раз, когда конкурирующие потоки вынуждены ждать доступа к ресурсу.

Tier Interaction

На этом рассмотрение методов профилирование закончим и продолжим учиться профилировать приложения.

Профилирование Sampling методом

Sampling это метод профилирования, который периодически опрашивает рассматриваемый процесс, чтобы определить активную функцию. В результате показывает количество раз, когда функция была в начале call stack во время тестирования.

Профилирование

Открываем тестовый проект PeopleTrax. Устанавливаем конфигурацию в Release (в Debug версию встраивается дополнительная информация для отладки приложения, и она плохо скажется на точности результатов профилирования).

В меню Analyze нажимаем на Launch Performance Wizard.

image

На этом шаге нужно выбрать метод профилирования. Выбираем CPU Sampling (recommended) и нажимаем Next.

image

Выбираем какое приложение мы будем профилировать, это PeopleTrax и кнопка Next. В следующем нажимаем Finish и автоматически запустится профайлер и наше приложение. На экране мы видим программу PeopleTrax. Нажимаем кнопку Get People, ждем завершения работы и Export Data. Закрываем блокнот и программу и профайлер сгенерирует отчет.

image

Профайлер сгенерировал отчет (*.vsp)

image

Анализ отчета Sampling метода

В Summary отображается график использования процессора в течение всего времени профилирования. Список Hot Path показывает ветки вызовов, которые проявили наибольшую активность. А в списке Functions Doing Most Individual Work (название которого говорит само за себя) – функции, которые занимали большее время процесса в теле этих функций.

Посмотрев на список Hot Path видим что метод PeopleNS.People.GetNames занимает почти последнее место в ветке вызовов. Его то и можно изучить внимательнее на предмет улучшения производительности. Нажимаем на PeopleNS.People.GetNames и перед нами открывается Function Details.

image

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

Function Code View показывает код метода, когда он доступен и подсвечивает наиболее «дорогие» строки в выбранном методе. Когда выбран метод GetNames видно, что он читает строки из ресурсов приложения используя StringReader, добавляя каждую строку в ArrayList. Нет очевидных способов улучшить эту часть.

Так как PeopleNS.People.GetPeople единственный, кто вызывает GetNames – нажимаем GetPeople. Этот метод возвращает ArrayList объектов PersonInformationNS.PersonInformation с именами людей и компаний, возвращенными методом GetNames. Тем не менее, GetNames вызывается дважды каждый раз, когда создается PersonInformation. (Это и показано желтым и красным выделением). Очевидно, что можно легко оптимизировать метод, создавая списки только один раз вначале метода.

image

image

Оптимизированный метод заменит старый при следующей сборке.

Перезапускаем профилирование в текущей сессии нажав Launch with Profiling в окне Performance Explorer. Нажимаем на Get People и Export Data. Закрываем блокнот и программу а профайлер сгенерирует новый отчет.

image

Чтобы сравнить два отчета – выбираем оба и ПКМ Compare Performance Reports. Колонка дельты показывает разницу в производительности версии Baseline с более поздней Comparison. Выбираем Inclusive Samples % и Apply.

Как видно выигрыш в производительности заметен невооруженным глазом

image

Профилирование методом Instrumentation

Этот метод полезен при профилировании операций ввода вывода, запись на диск и при обмене данными по сети. Этот метод предоставляет больше информации чем предыдущий, но он несет с собой больше накладных расходов. Бинарники полученные после вставки дополнительного кода получаются больше обычных, и не предназначены для развертывания.

В этот раз мы сосредоточим наш анализ на экспорте данных, в котором список людей записывается в файл блокнота.

Профилирование

В Performance Explorer выбираем Instrumentation и нажмаем Start Profiling. Нажимаем Get People. После загрузки людей ждем 10 секунд и нажмаем Export Data. Закрываем блокнот и программу. Профилировщик сгенерирует отчет.

Анализ

Профилировщик покажет такую картинку:

image

Мы не получили ту информацию, которую хотели. Отфильтруем данные. Мы специально ждали 10 секунд, чтобы просто отфильтровать ненужные сейчас данные профилирования. Отмечаем с 13-й до конца и нажимаем Filter by selection. Уже другой результат:

image

Hot Path показывает, что метод Concat занимает много времени (он также первый в списке Functions With Most Individual Work). Нажимаем на Concat, чтобы посмотреть детально информацию о методе.

image

Видно, что PeopleTrax.Form1.ExportData – единственный метод, который вызывает Concat. Нажимаем PeopleTrax.Form1.ExportData в вызывающих методах (Function calling this function).

image

В проекте уже есть оптимизированный метод с использованием StringBuilder. В проекте PeopleTrax добавляем переменную компиляции OPTIMIZED_EXPORTDATA. Сохраняем и снова запускаем профайлер и сравниваем отчеты. Сразу видно (да и логически понятно) что мы оптимизировали вызовы Concat (с 6000 до 0 раз).

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


Системные требования:
Процессор с тактовой частотой не ниже 1,8 ГГц. Рекомендуется использовать как минимум двухъядерный процессор.
2 ГБ ОЗУ; рекомендуется 8 ГБ ОЗУ (минимум 2,5 ГБ при выполнении на виртуальной машине)
Место на жестком диске: до 210 ГБ (минимум 800 МБ) свободного места в зависимости от установленных компонентов; обычно для установки требуется от 20 до 50 ГБ свободного места.
Скорость жесткого диска: для повышения производительности установите Windows и Visual Studio на твердотельный накопитель (SSD)
Видеоадаптер с минимальным разрешением 720p (1280 на 720 пикселей);

Описание:
Visual Studio Enterprise 2019 - Интегрированное комплексное решение для групп любого размера с высокими требованиями к качеству и масштабу. Воспользуйтесь полным набором инструментов и служб для разработки, создания сложных корпоративных приложений и управления ими.

Время раздачи: с 09:00 до 23:00 [/quote]

Microsoft Visual Studio 2019 Enterprise 16.11.5.iso
CRC32: 9FC233B3
MD5: 38ECAC8AC328EABFA1C198EA30555D5B
SHA256: 92FA96BB3D0C3F17EA5BBE43E7C55FCFAB1A541CC836FBA3328BB0A4944D99C8

Корпоративные методики разработки и операций:
Быстрая разработка качественного программного обеспечения
Гибкие инструменты, оптимизированные для проектов корпоративного масштаба, помогают управлять работой над несколькими проектами и группами в простой и понятной в использовании среде. Возможности DevOps в Visual Studio 2017 включают автоматизацию процессов выпуска и непрерывного развертывания. Сократите после развертывания цикл между производством и разработкой и быстрее исправляйте ошибки, обладая ценной информацией и данными, записанными непосредственно в рабочих средах.

Создание первоклассных мобильных приложений:
Поставка приложений корпоративного уровня
Visual Studio Enterprise включает Xamarin, что позволяет разрабатывать приложения для Android, iOS и Windows. Создавайте приложения с производительностью машинного кода и встроенным пользовательским интерфейсом этих платформ с помощью инструментов корпоративного уровня. Оптимизируйте производительность приложения с помощью подробных данных профилирования и исследуйте их в среде выполнения для быстрого поиска ошибок. Проверьте взаимодействие с пользователями на настоящих устройствах в тестовом облаке Xamarin, а затем распределите свои приложения по тест-инженерам бета-версии внутри компании или непосредственно в магазине приложений.

Высокое качество кода:
Модульное тестирование — теперь быстрее и проще
Используйте IntelliTest для быстрого автоматического создания соответствующих модульных тестов для кода. IntelliTest позволяет существенно сократить усилия при создании модульных тестов для нового или существующего кода, что позволяет больше внимания уделить созданию функций. Легко создавайте наборы модульных тестов для устаревшего кода, который раньше никогда не рассматривался, и с минимальными усилиями увеличьте покрытие путей и качество кода.

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

Неограниченное нагрузочное тестирование:
Поймите, на что способно ваше приложение, перед развертыванием
Visual Studio упрощает интеграцию нагрузочного тестирования в процесс разработки и помогает избежать опасных сюрпризов в рабочей среде. Причиной этих сюрпризов может быть распространение по всему миру, масштаб базы клиентов или проблемы, проявляющиеся только при многодневных циклах выполнения, — нагрузочное тестирование Visual Studio предоставит аналитические данные для устранения этих проблем еще до развертывания.

DevOps для баз данных:
Распространение процессов DevOps на базы данных SQL Server
Инструменты данных Redgate теперь включены в Visual Studio Enterprise. С ReadyRoll Core вы можете разрабатывать, создавать версии и безопасно автоматизировать развертывания изменений баз данных вместе с изменениями приложений. Redgate SQL Prompt Core помогает легко разрабатывать код SQL в Visual Studio. Повысьте производительность с помощью автозаполнения объектов базы данных, системных объектов и ключевых слов, а также получайте предложения столбцов по мере ввода.

Преимущества подписки:
Включает все, что необходимо разработчику
С подпиской Visual Studio Enterprise вы получите доступ к непрерывному обучению и его преимуществам, в том числе полный доступ к Pluralsight, а также актуальные данные о новейших технологиях. Кроме того, благодаря включенному программному обеспечению для разработки и тестирования, технической поддержке, а также преимуществам Azure вы можете бесплатно настроить облачные среды и экспериментировать с последними продуктами и облачными службами Майкрософт. Максимальные возможности для разработчика!

Этапы написания программы

Здорова господа! Я давно уже хотел написать статью о том как пользоваться отладкой в visual studio 2010, я сам правда не сильно знаю, от поэтому и пишу статью, что б разобраться и потом если что подсмотреть как ей пользоваться.

Содержание:

Базовые операции отладки

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

QIP Shot - Screen 126

Мы можем выполнить этот пример по одному оператору за раз и наблюдать за содержимым интересующих переменных.

Прежде всего следует убедиться, что конфигурация сборки примера установлена в Win32 Debug, а не Win32 Release.

QIP Shot - Screen 127

Можно также использовать меню Построение -> диспетчер конфигурации и в открывшемся окне посмотреть

Конфигурация проекта Debug включает дополнительную информацию в вашу исполняемую программу во время компиляции, что позволяет потом использовать возможности отладки.

Установка точек останова

QIP Shot - Screen 131

Чтобы установить точку останова в начале строки исходного кода, щелкните на серой колонке слева от номера строки с оператором, перед которым хотите остановить выполнение. В ней появится красный кружок, называемый глифом (glyph), указывающий на точку останова в строке. Удалить эту точку можно с помощью двойного щелчка.

Расширенные точки останова

Более совершенный способ установки точек останова предлагается в окне, которое открывается с помощью комбинации клавиш <Alt+F9> или выбора пункта Breakpoints(Точки останова) из списка, отображаемого при выборе кнопки Windows(Окна) панели инструментов Debug, которая находится в ее правой части

QIP Shot - Screen 132

появится окно

Окно точек останова

в этом окне вы можете также настраивать точки останова, просто посмотрите что там есть, попробуйте понажимать по кнопкам.

Дополнительные параметры для точки останова устанавливаются целчком правой кнопкой мыши на строке останова в окне Breakpoints и выбором соответствующих пунктов из контекстного меню. Наряду с установкой точки останова в определенном месте кода можно также установить точку останова когда определенное логическое выражение вернет значение true. Это мощное средство, но оно влечет за собой очень существенные накладные расходы при выполнении программы, поскольку проверочное выражение должно постоянно вычисляться.

Установка точек трассировки

Function: $FUNCTION, Thread: $TID $TNAME

QIP Shot - Screen 136

Запуск отладки

меню отладка

Существует пять способов запуска приложения в режиме отладки через меню Debug (Отладка), которое показано ниже

  1. Пункт Start Debugging (Начать отладку), доступный и как кнопка панели инструментов Debug, просто запускает программу до первой точки останова (если она есть), где выполнение будет приостановлено. После того как вы просмотрите все необходимое в этой точке, выбор того же пункта меню или той же кнопки панели инструментов продолжит выполнение вплоть до следующей точки останова. Подобным образом можно передвигаться по программе от одной точки останова к другой и при каждой остановке выполнения просматривать критичные переменные, а по мере необходимости и изменять их значения. Если точек останова нет, запуск отладчика таким способом приведет к выполнению всей программы без остановок. Конечно факт запуска отладки подобным образом не означает, что вы обязаны продолжать ее в такой же манере при каждой остановке выполнения можно выбрать любой из доступных вариантов перемещения по коду.
  2. Пунк Attach to Process (Присоединиться к процессу) меню Debug позволяет отлаживать программу, которая уже запущена. Это средство отображает список процессов, работающих на машине, в котором можно выбрать процесс, требующий отладки. Это инструмент для опытных пользователей, и лучше избегать экспериментов с ним, если только вы не уверены в том, что собираетесь делать. Можно очень легко заблокировать машину или вызвать другие проблемы, если вмешаться в критические процессы операционной системы.
  3. Пункт меню Step Into (Войти), также доступный как кнопка панели инструментов Debug, выполняет программу по одному оператору за раз, входя в каждый блок кода, включая каждую вызываемую функцию. Это может оказаться весьма утомительным, если использовать такой режим отладки на протяжении всего процесса, поскольку при этом, например, будет выполняться весь код библиотечных функций, что вряд ли вас заинтересует, если только вы не заняты их разработкой. Небольшое количество библиотечных функций написано на языке ассемблер, включая некоторые из тех, которые поддерживают потоковый ввод вывод. Функции на языке ассемблер выполняются по одной машинной инструкции за раз, что как и можно ожидать, занимает значительное время.
  4. Пункт Step Over (Перешагнуть), также доступный в виде кнопки панели инструментов Debug, выполняет операторы программы по одному за раз и выполняет весь код функций, которые могут быть вызваны в операторе, без остановок.

[note]Какой бы способ из пяти вы б не выбрали для запуска процесса отладки, продолжайте выполнение, применив одну из пяти возможностей в любой из промежуточных точек останова.[/note]

Дальше просто ставите точки останова в коде, запускаете отладку любым из пяти способов, и затем смотрите необходимые значения переменных в меню Отладка=>Окна

QIP Shot - Screen 138

Как видно из рисунка выше можно посмотреть локальные и видимые переменные, а также их изменить. Что бы посмотреть локальные переменные выберите пункт Локальные.

QIP Shot - Screen 139

Вы их можете менять наведя на значение переменной и нажав два раза клавишей мышки

Так же можно посмотреть значение переменной наведя курсор мышки на эту переменную

QIP Shot - Screen 140

Так же можно посмотреть стек вызовов в окне Стек вызовов

QIP Shot - Screen 141

Во вкладке Отладка=>Окна=>Контрольные значения можно задавать переменные которые нужно отслеживать

QIP Shot - Screen 142

QIP Shot - Screen 143

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

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

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

Первый способ, с помощью которого можно проверить поведение программы, обеспечивается библиотечной функцией С++

Использование Утверждений

Файл заголовка стандартной библиотеки cassert объявляет функцию assert(), которую можно использовать для проверки логических условий в программе, когда не определен специальный символ препроцессора NDEBUG. Эта функция объявлена следующим образом

Читайте также: