Comment obtenir l'utilisation actuelle du processeur et de la RAM en C ++?
Question
est-il possible, en C ++, d’obtenir l’utilisation actuelle de la mémoire vive et du processeur? Existe-t-il un appel de fonction indépendant de la plate-forme?
La solution
Il existe une bibliothèque open source qui donne ces informations (et davantage d'informations système) sur de nombreuses plates-formes: API SIGAR
Je l'ai utilisé dans des projets assez volumineux et cela fonctionne bien (sauf dans certains cas avec Mac OS X, etc.)
Autres conseils
Malheureusement, ces éléments dépendent fortement du système d'exploitation sous-jacent. Il n'y a donc pas d'appels indépendants de la plate-forme. (Peut-être existe-t-il des frameworks de wrapper, mais je n'en connais aucun.)
Sous Linux, vous pouvez consulter l'appel de fonction getrusage () , le Windows, vous pouvez utiliser GetProcessMemoryInfo () pour l'utilisation de la RAM. Consultez également les autres fonctions de l’ API Process Status <. / a> de Windows.
À ma connaissance, il n’existe pas de fonction indépendante de la plate-forme. SI vous prévoyez de cibler plusieurs versions de Windows, sachez que la mise en œuvre diffère d’une version à l’autre. Je rencontre ce problème lors du test d’une application sous NT 3.51, par exemple ... (archaïque, je sais).
Voici un code que j'ai utilisé pour le côté mémoire. Cela ne fonctionne pas sur d'autres plates-formes que Windows et renvoie simplement 0 lorsqu'il est compilé sans la définition WIN32:
EDIT: J'ai oublié de mentionner, ce code se divise et se arrondit au Mo le plus proche, d’où le > > 20 partout.
// get memory info...
int getTotalRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20);
}
#endif
return ret;
}
int getAvailRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20);
}
#endif
return ret;
}
int getTotalMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
}
#endif
return ret;
}
int getAvailMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
}
#endif
return ret;
}
Non, il n'y en a pas, pas dans la norme.
Si vous avez vraiment besoin de ces informations, vous devrez écrire #ifdefs spécifique à la plate-forme ou créer un lien vers une bibliothèque qui les fournit.
Sous Linux, cela utilisera / proc / self / status. Plus de travail est nécessaire pour transformer cela en un nombre. Je trouve cela utile dans l'état actuel des choses, juste pour imprimer l'utilisation de la mémoire directement à l'écran sous forme de chaîne.
static string memory_usage() {
ostringstream mem;
PP("hi");
ifstream proc("/proc/self/status");
string s;
while(getline(proc, s), !proc.fail()) {
if(s.substr(0, 6) == "VmSize") {
mem << s;
return mem.str();
}
}
return mem.str();
}
Il n’existe aucun moyen indépendant de la plate-forme de le faire. Bien que pour Windows, vous pouvez obtenir les mesures de performance et d’utilisation du processeur en utilisant PDH.dll (Performance Data Helper) et ses API associées dans votre code.
Pas directement.
Mais vous pouvez utiliser une bibliothèque qui résume le système d'exploitation (telle que ACE).
Bien que cela puisse être un peu lourd si vous voulez juste du processeur et de la mémoire.
Si tel est toujours le cas, veuillez vérifier:
http://sourceforge.net/projects/cpp-cpu-monitor/
Il vous donne un exemple sur la façon d'utiliser le processeur et la mémoire vive d'un système Linux (testé sous Debian et CentOS), ainsi qu'une instruction assez simple sur la procédure d'installation.
N'hésitez pas à demander si vous avez des questions concernant ce petit projet.