Как я могу программно найти время ЦП, которое отображается в System Idle Process (в диспетчере задач) с помощью Visual C++?
Visual C++: как получить процессорное время?
Ответы (5)
То, что вы хотите, это что-то вроде этого...
NTSTATUS hStatus;
SYSTEM_PERFORMANCE_INFORMATION stSysPerfInfo;
hStatus = NtQuerySystemInformation(SystemPerformanceInformation, &stSysPerfInfo, sizeof(stSysPerfInfo), NULL);
if (hStatus != NO_ERROR)
{
// Do work....
}
Или взгляните на этот "Диспетчер задач"
http://reactos.freedoors.org/Reactos%200.3.8/ReactOS-0.3.8-REL-src/base/applications/taskmgr/
У меня нет окон, чтобы действительно знать, в чем вопрос, но, возможно, вы можете заглянуть в стандартную функцию std:: clock для измерения затраченного процессорного времени. Если вы запрашиваете это время дважды, количество тиков за истекший период времени можно преобразовать в секунды с помощью константы CLOCKS_PER_SEC.
Результатом будет время ЦП, потраченное вашим процессом, которое будет отличаться от настенных часов. Он может быть выше в многопоточных приложениях или ниже, если ваш код _sleep_s, так как он не будет тратить время.
void f()
{
std::clock_t init = std::clock();
// perform some operations
std::clock_t end = std::clock();
std::cout << end-init << " cpu ticks spent, or about "
<< (end-init)/CLOCKS_PER_SEC << " seconds." << std::endl;
}
Это не будет учитывать время ЦП перед первым измерением, но может дать вам точное измерение стандартным способом.
Я бы использовал счетчики производительности WMI, в частности Process/%ProcessorTime/Idle.
Прочитайте эту статью, чтобы узнать, как это сделать на C# http://www.codeproject.com/KB/dotnet/perfcounter.aspx
и в C++: http://msdn.microsoft.com/en-us/library/aa394558(VS.85).aspx
Надеюсь, что это ответ на ваш вопрос.
Также см. мой пост на эту тему: http://osequal.blogspot.com/2009/03/accurate-time-measurement-for.html . В частности, проверьте реализацию tick_count в библиотеке Intel TBB: http://cc.in2p3.fr/doc/INTEL/tbb/doc/html/a00199.html