Как получить количество циклов ЦП, используемых процессом - PullRequest
12 голосов
/ 30 июня 2011

Мне нужно получить количество циклов ЦП, используемых конкретным процессом с использованием C # (или VB.Net).Эта информация доступна во всплывающем окне свойств процесса в обозревателе процессов Sysinternal.Например, браузер, который я использую для публикации в этом сообщении, в настоящее время использует 18 521 360 160 циклов (дайте или возьмите несколько сотен миллионов).Кто-нибудь знает, как получить эту информацию из приложения .Net?Я знаю, как получить загрузку процессора (в процентах), но это не то, что я ищу.Мне нужен способ сравнить загрузку ЦП между двумя разными процессами, запущенными в разное время.

Спасибо, Мэтт

Обновление:
Зачем мне это нужно?Я являюсь лидером локальной группы пользователей .Net, и мы выполняем задачу по коду, где разработчики представляют код для решения проблемы.Мне нужен способ измерить производительность одной записи против другой.В настоящее время я использую таймер для измерения производительности.Сервер на 100% выделен для этого, но это не гарантирует, что одновременно может происходить что-то еще.Очевидно, что это связано со всевозможными потенциальными проблемами, но в целом это довольно точно.Измерение количества использованных циклов ЦП было бы почти безошибочным способом измерить, насколько хорошо чья-то запись работает против другой.Я уверен, что кто-то может пробить дыры во всем этом - не нужно пытаться на этом этапе.;-) Я надеюсь, что это поможет объяснить причину моего вопроса и почему таймера недостаточно для решения моей проблемы.

Ответы [ 3 ]

20 голосов
/ 30 июня 2011

Process Explorer вызывает QueryProcessCycleTime, чтобы получить эту информацию. Вам, вероятно, придется использовать P / Invoke для его вызова. Я ожидаю, что его подпись P / Invoke будет выглядеть так:

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool QueryProcessCycleTime(IntPtr ProcessHandle, out ulong CycleTime);
1 голос
/ 30 июня 2011

Здесь есть статья CodeProject: http://www.codeproject.com/KB/system/processescpuusage.aspx

Я думаю, что эта статья поможет вам сделать именно то, что вы пытаетесь сделать. В основном они показывают вам 2 способа сделать это, один с использованием управляемых инструментов System.Diagnostics, а второй с помощью вызова метода Win API.

1 голос
/ 30 июня 2011

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

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

Помните также, что число циклов ЦП не совпадает (а на x86 даже не похоже) с количеством выполняемых инструкций.«

...