Created
July 14, 2020 05:15
-
-
Save andraantariksa/ddba60e05261fa52ea97dda547bf9774 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <windows.h> | |
#include <vector> | |
#include <iostream> | |
#include <winternl.h> | |
#pragma comment(lib, "Ntdll.lib") | |
typedef struct | |
_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R { | |
LARGE_INTEGER IdleTime; | |
LARGE_INTEGER KernelTime; | |
LARGE_INTEGER UserTime; | |
LARGE_INTEGER DpcTime; | |
LARGE_INTEGER InterruptTime; | |
ULONG InterruptCount; | |
} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R; | |
class CPU | |
{ | |
public: | |
uint64_t prev_idle = 0; | |
uint64_t prev_ker = 0; | |
uint64_t prev_user = 0; | |
uint64_t cur_idle = 0; | |
uint64_t cur_ker = 0; | |
uint64_t cur_user = 0; | |
double get() | |
{ | |
SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R *a = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R[4]; | |
// 4 is the total of proc | |
NtQuerySystemInformation(SystemProcessorPerformanceInformation, a, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R) * 4, NULL); | |
prev_idle = cur_idle; | |
prev_ker = cur_ker; | |
prev_user = cur_user; | |
cur_idle = 0; | |
cur_ker = 0; | |
cur_user = 0; | |
for (int i = 0; i < 4; ++i) | |
{ | |
SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION_R b = a[i]; | |
cur_idle += b.IdleTime.QuadPart; | |
cur_ker += b.KernelTime.QuadPart; | |
cur_user += b.UserTime.QuadPart; | |
} | |
uint64_t delta_idle = cur_idle - prev_idle; | |
uint64_t delta_kernel = cur_ker - prev_ker; | |
uint64_t delta_user = cur_user - prev_user; | |
uint64_t delta_sys = delta_kernel + delta_user; | |
delete[] a; | |
return (delta_sys - delta_idle) * 100.0 / delta_sys; | |
} | |
}; | |
int main() | |
{ | |
CPU a; | |
std::cout << "starting" << '\n'; | |
while(1) | |
{ | |
std::cout << a.get() << '\n'; | |
Sleep(1000); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment