Профилирование производительности приложения без установки Visual Studio

Думаю, многие программисты пользовались средствами анализа производительности, удобно интегрированных прямо в Visual Studio. Процесс настолько интуитивно понятен из графического интерфейса, что совсем не приходится задумываться, что в действительности, за сбор статистики работы приложения отвечает консольное приложение VsPerfCmd. Задумываться о том, что «под капотом» может понадобиться, если, к примеру, нужно собрать данные на компьютере без установленной Visual Studio. Сразу в голову приходит аналогия с удаленной отладкой, но в данном случае всё даже проще — специальный сервис просто собирает статистику в файл результатов, который потом можно открыть Visual Studio или добавить к существующим отчетам анализа производительности. Единственное требование — к исследуемым dll и exe файлам должны быть скопированы pdb-файлы, в противном случае проанализировать узкие места не удастся. Итак, первым делом, нужно установить сервис сбора статистики, инсталлятор находится в %VSInstallDir% Team ToolsPerformance ToolsSetups. Для VS 2012 — «C:Program Files (x86)Microsoft Visual Studio 11.0Team ToolsPerformance ToolsSetupsvs_profiler_x64_enu.exe»

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

$tool = "C:Program Files (x86)Microsoft Visual Studio 11.0Team ToolsPerformance ToolsVSPerfCmd.exe"
$toolProcess = Start-Process $tool -ArgumentList "/Start:Sample /Output:c:perfstats2.vsp /Launch:""$analyzedProgramPath"" /Args:args "
$processName = [io.path]::GetFileNameWithoutExtension($analyzedProgramPath)
for ($i=0; $i -lt 1000; $i = $i+1) {
    $p = get-process ProcessName -ErrorAction SilentlyContinue<
    if (!$p) { break; }

    sleep -s 1 } Write-Host "Stopping collect..." $tool /Shutdown /Analyze:Procid

 

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