¿es posible, en C++, obtener el uso actual de la RAM y la CPU? ¿Hay una llamada de función independiente de la plataforma?¿Cómo obtener el uso actual de CPU y RAM en C++?
Respuesta
Hay una biblioteca de código abierto que da a estos (y más información sistema de cosas) a través de muchas plataformas: SIGAR API
Lo he utilizado en grandes proyectos con y funciona bien (a excepción de ciertos casos de esquina en OS X etc.)
No, no hay, no en el estándar.
Si realmente necesita esta información, tendrá que escribir #ifdefs específicos de la plataforma o vincularlos contra una biblioteca que lo proporcione.
Lamentablemente, estas cosas dependen en gran medida del sistema operativo subyacente, por lo que no hay llamadas independientes de la plataforma. (Tal vez haya algunos frameworks wrapper, pero no conozco ninguno.)
En Linux puede echar un vistazo a la llamada a la función getrusage(), en Windows puede usar GetProcessMemoryInfo() para uso de RAM. También eche un vistazo a las otras funciones en el Process Status API de Windows.
No existe una función de plataforma independiente 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 en NT 3.51, por ejemplo ... (arcaico, lo sé).
Aquí hay un código que utilicé para el lado de la memoria. Esto no funciona en plataformas que no sean Windows, y simplemente devolverá 0 cuando se compila 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 por 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;
}
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 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.
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 es todavía el caso, por favor compruebe:
http://sourceforge.net/projects/cpp-cpu-monitor/
Le da un ejemplo de cómo alcanzar la CPU y la RAM el uso de un Linux (probado en Debian y CentOS) y unos instrucción simple de cómo instalar.
No dude en preguntar si tiene alguna pregunta sobre este pequeño proyecto.
- 1. ¿Cómo puedo obtener el uso de CPU y/o RAM de * THREAD * en C# (código administrado)?
- 2. ¿Cómo obtener el uso de la CPU en C?
- 3. Cómo obtener el uso de CPU en asp.net
- 4. Cómo simular diferentes frecuencias de CPU y limitar RAM
- 5. C++ CPU Registrar uso
- 6. ¿Cómo puedo encontrar el uso de la CPU y la RAM con PowerShell?
- 7. ¿Cómo obtengo la velocidad de la CPU y la ram física total en C#?
- 8. Obtener uso de porcentaje de CPU
- 9. ¿Cómo obtener estadísticas de uso de CPU en Android?
- 10. ¿Cómo reviso el uso de CPU y memoria en Java?
- 11. Cómo obtener el uso total de la CPU en Linux (C++)
- 12. ¿Obtener uso de CPU en script de shell?
- 13. asignando ram muestra el doble de uso de RAM en el administrador de tareas
- 14. Obtener el tamaño del sistema RAM
- 15. Devolver el uso de la CPU en WMI con C#
- 16. Obtención de uso de CPU con golang
- 17. ¿Cómo obtener el directorio actual?
- 18. ¿Cómo puedo obtener el uso de la CPU y la memoria?
- 19. ¿cuánto espacio extra/RAM/CPU utiliza apache solr?
- 20. obtener el objeto libro actual en C#
- 21. Cómo obtener el uso de CPU por hilo en Windows (win32)
- 22. Cómo obtener la frecuencia de la CPU en C#
- 23. Aplicación C# - Reducir el uso de la CPU
- 24. ¿Cómo puedo obtener el DateTime actual del precompilador en C#?
- 25. ¿Cómo obtener el tamaño de RAM total de un dispositivo?
- 26. ¿Cómo obtener el directorio actual en un programa C?
- 27. Limitar el uso de memoria y CPU de aplicación Java
- 28. ¿Cómo y cuándo abandonar el uso de matrices en C#?
- 29. Contador de rendimiento El uso de la CPU para el proceso actual es más de 100
- 30. Python/PySerial y uso de CPU
¿Por qué es esto triste? La gran variedad de CPU/RAM/NUMA/(inserte uno o más acrónimos aquí) hace que un mecanismo de informe independiente de la plataforma sea algo limitado. – MSN
getrusage no configura la mayoría de los campos, ya que por ahora, el uso de RAM no se establece de acuerdo con su enlace –