Подтвердить что ты не робот

Как получить количество циклов процессора, используемых процессом

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

Спасибо, Matt

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

4b9b3361

Ответ 1

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

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool QueryProcessCycleTime(IntPtr ProcessHandle, out ulong CycleTime);

Ответ 2

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

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

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

Ответ 3

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

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