usar resueltos memoria ejercicios ejemplos ejemplo dinamicos dinamica como asignacion arreglos c++ cpu-usage ram

c++ - resueltos - memoria dinamica en c ejemplos



¿Cómo obtener el uso actual de CPU y RAM en C++? (8)

Lamentablemente, estas cosas dependen en gran medida del sistema operativo subyacente, por lo que no hay llamadas independientes de la plataforma. (Tal vez hay algunos frameworks de contenedor, pero no conozco ninguno).

En Linux puede echar un vistazo a la llamada a la función getrusage () , en Windows puede usar GetProcessMemoryInfo () para el uso de RAM. También eche un vistazo a las otras funciones en la API de estado de proceso de Windows.

¿Es posible, en C ++, obtener el uso actual de la RAM y la CPU? ¿Hay una llamada de función independiente de la plataforma?


No directamente.

Pero puede usar una biblioteca que abstraiga el sistema operativo (como ACE).
Aunque esto podría ser un poco pesado si solo quieres CPU y memoria.


No, no hay, no en el estándar.

Si realmente necesita esta información, tendrá que escribir #ifdefs específicos de la plataforma o un enlace contra una biblioteca que lo proporcione.


No hay una plataforma independiente para hacer esto. Aunque para Windows, puede obtener el uso de la CPU y las métricas de rendimiento utilizando PDH.dll (Performance Data Helper) y sus API relacionadas en su código.

Aquí hay más sobre cómo usarlo.


Hay una biblioteca de código abierto que ofrece estos (y más cosas de información del sistema) en muchas plataformas: SIGAR API

Lo he usado en proyectos bastante grandes y funciona bien (excepto en ciertos casos de esquina en OS X, etc.)


No hay una función independiente de plataforma para esto que yo sepa. SI planea enfocarse en múltiples versiones de Windows, tenga en cuenta que la implementación es diferente en algunas versiones. Llegué a este problema al probar una aplicación bajo NT 3.51, por ejemplo ... (arcaico, lo sé).

Aquí hay un código que utilicé para el lado de la memoria de las cosas. Esto no funciona en plataformas que no sean Windows, y solo devolverá 0 cuando se compile sin la definición de WIN32:

EDITAR: Olvidé mencionar que este código se divide y redondea al MB más cercano, de ahí el >> 20 en todo el lugar.

// 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; }


En Linux, esto usará / proc / self / status. Se requiere más trabajo para convertir esto en un número. Sin embargo, considero que esto es útil, solo para imprimir el uso de la memoria directamente en la pantalla como una cadena.

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(); }


Si ese sigue siendo el caso, compruebe:

http://sourceforge.net/projects/cpp-cpu-monitor/

Le da un ejemplo de cómo obtener el uso de CPU y RAM de un Linux (probado en Debian y CentOS) y una instrucción bastante simple de cómo instalarlo.

Por favor, siéntase libre de preguntar si tiene alguna pregunta sobre este pequeño proyecto.