Измерить/измерить загрузку ЦП без TaskMgr?

Я пытаюсь измерить уровень использования ЦП во время длительного процесса. Я подозреваю, что каждый раз, когда я запускаю диспетчер задач для просмотра данных, загрузка ЦП процесса снижается, потому что диспетчер задач имеет более высокий приоритет. Если я даю своему процессу приоритет RealTime, то диспетчер задач полностью блокируется, и я не могу его использовать. Я хочу, чтобы большая часть циклов моего процессора была посвящена этому процессу, и я хочу получить приблизительное представление о том, сколько он использует. Мне не нужен посекундный монитор, а достаточно нескольких моментальных снимков, которые дадут мне знать, что происходит. Как я могу это сделать?


person SFun28    schedule 05.11.2010    source источник
comment
не переводите свой процесс в режим реального времени, если вы хотите, чтобы что-то еще выполнялось (например, курсор мыши).   -  person Gabe    schedule 07.11.2010


Ответы (5)


Программно с API C вы можете использовать API счетчика производительности. (Использование ЦП - это просто еще один счетчик). Вы можете использовать низкоуровневый API-интерфейс реестра счетчик производительности для данных. Или вы можете использовать API PDH. (Performance Data Helper API) - это, вероятно, то, что вы хотите. Я использовал оба в прошлом, и API PDH прост в использовании.

Еще одним инструментом, который поможет вам перечислить имена доступных счетчиков, является perfmon. (Просто запустите c:\windows\system32\perfmon.exe). Это также полезная альтернатива диспетчеру задач. Он также ведет журналы и графики. И вы можете настроить счетчики для каждого логического процессора на многопроцессорной машине.

person selbie    schedule 06.11.2010
comment
C API мне недоступен, но отличное предложение по perfmon! Я всегда забываю использовать этот инструмент. Эта статья была полезна: adminfoo.net/2007/04/windows -perfmon-top-ten-counters.html - person SFun28; 08.11.2010

Вероятно, procdump, но один из инструментов обработки sysinternals должен помочь

person Martin Beckett    schedule 05.11.2010

Я не уверен, что ваше беспокойство по поводу диспетчера задач обоснованно. Диспетчер задач достаточно легкий, поэтому он не заглушит ваш длительный процесс и не заберет достаточное количество циклов ЦП, чтобы иметь значение. Если ваш процесс действительно так требователен к процессору, вы увидите это в диспетчере задач. Если вы не видите такой загрузки ЦП, как вы ожидаете, для вашего процесса, возможно, ваши предположения о том, что ваш процесс занимает некоторое время, потому что он использует много ЦП, неверны. Возможно, ваш длительный процесс работает долго, потому что его ввод-вывод связан или ожидает событий или много спит. то есть делать что-то ДРУГОЕ, чем использовать ЦП. Если он использует много ЦП, но не на 100%, как вы хотите, возможно, он не так эффективен, как может быть, по тем же причинам, которые я перечислил выше.

person bot403    schedule 05.11.2010
comment
Что может объяснить зависание taskmgr, когда мой процесс настроен на RealTime, но прекрасно работает, когда приоритет установлен на High? Мой процесс в основном связан с процессором (на самом деле я просто автоматизирую Excel, а Excel - это реальный рассматриваемый здесь процесс - он обрабатывает тяжелые вычисления) - person SFun28; 08.11.2010
comment
Процессы, которые не предназначены для работы в режиме реального времени, заморозят остальную часть системы, если они не уступят время. то есть они должны быть разработаны для работы с приоритетом в реальном времени. Зависание с приоритетом в реальном времени может произойти с любым приложением, не предназначенным для этого. - person bot403; 08.11.2010

вы можете написать простой инструмент, который запрашивает этот конкретный процесс (например, по идентификатору) через Получить время

что-то в строках:

main()
  HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
  for(;;) { 
    GetProcessTimes(h, /*..times.. */);
    printf("time taken %d\n", (kerneltime+usertime));
    Sleep(1000);
  }
person DennyRolling    schedule 06.11.2010
comment
Я уверен, что в .net есть способ сделать это. Я не касался С++ более десяти лет. Ищем готовый инструмент. Попробую другие предложения в этом посте, такие как perfmon и sysinternals. - person SFun28; 08.11.2010

@martin Becket: procmon позволяет увидеть подробную информацию об использовании процессора в свойствах конкретного процесса.

person Bascy    schedule 10.11.2010