Профилирование приложения позволяет разработчику измерять, оценивать производительность приложения и кода.
Результатом выполнения профилирования является абсолютная (время) и относительная (проценты) статистика выполнения отдельных участков кода (если возможно, с точностью до строки). После оптимизации «узких мест» (критичных для производительности участков кода) нужно запустить профилирование ещё раз и сравнить результаты.

Visual Studio Profiling Tool

Visual Studio Profiling Tool это встроенный в IDE инструмент. Запуск производится из Visual Studio через меню Analyze -> Performance and Diagnostics.
С помощью нескольких простых шагов выбираем метод профилирования, исследуемые проекты и нужно ли профилировать запросы к БД через ADO.NET.

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

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

Отчет содержит 4 значения для предоставления затраченного времени:

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

.NET Memory allocation — профайлер собирает информацию о типе, размере, а также количество объектов, которые были созданы в распределении или были уничтожены сборщиком мусора. Профилирование памяти почти не влияет на производительность приложения в целом.

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

Tier Interaction – добавляет информацию в файл для профилирования о синхронных вызовах ADO.NET между страницей ASP.NET или другими приложениями и SQL сервера. Данные включают число и время вызовов, а также максимальное и минимальное время.

После нажатия кнопки Finish запускается браузер, при этом в студии будет висеть заставка с кнопками Pause и Stop.

Документация по работе с профайлером http://msdn.microsoft.com/en-us/library/bb385749.aspx

dotTrace

Еще одним популярным инструментом для профилирования приложений на основе платформы .NET Framework  является dotTrace компании jetBrains. dotTrace поддерживает интеграцию с Visual Studio.

Основные возможности:

  • Профилирование по требованию – dotTrace может динамически присоединятся к запущенному приложению, что сводит к минимуму накладные расходы на запуск приложения для профилирования. Более того, эта возможность позволяет исследовать проблемы производительности в реальной среде, где вы просто не можете позволить себе перезапустить приложение каждый раз, когда вам нужно измерить его производительность.
  • Профилирование модульных тестов.
  • Удаленное профилирование. При необходимости профилирования приложения на удаленном веб-сервере dotTrace может подключаться к удаленной машине при этом даже нет необходимости устанавливать dotTrace там – достаточно просто скопировать пару файлов.
  • Сравнение снимков состояния программы: можно сравнивать два любые снимка состояния (snapshots) программы, при этом программа выдаст анализ их различий.
  • Детальная статистика по функциям: поддерживается сбор статистики по каждой функции, соответственно, в дереве вызовов можно легко получить информацию по количеству вызовов каждой функции и др.
  • Расширенная фильтрация: можно настраивать программу на сбор информации только по нужным функциям.
  • Профилирование памяти: поддерживается анализ потребляемой памяти .NET-приложениями. Причем профилирования может выполняться в двух режимах: путем формирования снимков (дампов) памяти во время выполнения программы, что позволит выявить загрузку ненужных объектов в память, а также путем сравнения состояния памяти в начале и конце некоторого временного интервала, при этом программа проведет анализ и выдаст информацию о новых (New), живых (Live), мертвых (Dead) и ненужных (Garbage) объектах.

При выборе File -> Profile появляется окно с выбором типа приложения, задаём настройки и Run!
После запуска профайлинга появляется небольшое окно, с помощью которого можно получить результат (Get Snapshot) или завершить профайлинг.

dotTrace

dotTrace

После получения результата увидим следующее окно:

3-3

Здесь видим дерево методов с процентами и временем выполнения. В правой части можно посмотреть исходник того или иного метода.

Продукт имеет очень качественную документацию http://www.jetbrains.com/profiler/documentation/