Измерить / измерить загрузку процессора без TaskMgr? - PullRequest
1 голос
/ 05 ноября 2010

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

Ответы [ 5 ]

1 голос
/ 07 ноября 2010

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

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

1 голос
/ 05 ноября 2010

Возможно, prodump - но один из sysinternals process tools должен помочь

0 голосов
/ 10 ноября 2010

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

0 голосов
/ 07 ноября 2010

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

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

main()
  HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
  for(;;) { 
    GetProcessTimes(h, /*..times.. */);
    printf("time taken %d\n", (kerneltime+usertime));
    Sleep(1000);
  }
0 голосов
/ 05 ноября 2010

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

...