是否有可能在C++中获取当前的RAM和CPU使用率?是否有平台无关的函数调用?如何在C++中获取当前的CPU和RAM使用情况?
回答
有一个开放源码库在许多平台给出了这些(以及更多的系统信息的东西):SIGAR API
我用它在相当大的项目,它工作正常(除在OS X上的某些角落案例等)
不,没有,没有在标准中。
如果您确实需要此信息,您必须针对提供该信息的库编写特定于平台的#ifdefs或链接。
不幸的是,这些事情严重依赖于底层操作系统,所以没有平台无关的调用。 (也许有一些包装框架,但我不知道任何。)
在Linux上,你可以看看getrusage()函数调用,在Windows上,你可以使用GetProcessMemoryInfo()作为RAM使用。还可以看看Windows的Process Status API中的其他功能。
对于我来说,没有一个平台无关的功能。如果您打算针对多个版本的Windows,请注意实施方式在某些版本中存在差异。我在测试NT 3.51下的应用程序时遇到了这个问题,例如......(古老的,我知道)。
这里是我用于内存方面的一些代码。这不适用于除Windows之外的其他平台,并且在编译时没有使用WIN32定义时将返回0:
编辑:我忘了提及,此代码划分并舍入到最近的MB,因此>> 20到处都是。
// 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;
}
不直接。
但是,您可以使用抽象操作系统的库(如ACE)。
虽然这可能会有点沉重,如果你只是想要CPU和内存。
没有平台独立的方式来做到这一点。尽管对于Windows,您可以通过在代码中使用PDH.dll(性能数据助手)及其相关的API来获取CPU使用率和性能指标。
在Linux上,这将使用/ proc/self/status。需要更多的工作才能将其转化为数字。但我觉得这很有用,只是将内存使用情况直接作为字符串打印到屏幕上。
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();
}
如果还在的话,请检查:
http://sourceforge.net/projects/cpp-cpu-monitor/
它给你一个例子,如何获得Linux操作系统(在Debian和CentOS测试)的CPU和RAM的使用和相当简单的指导如何安装。
请随时询问您是否对此小型项目有任何疑问。
- 1. 如何在Python中获取当前的CPU和RAM使用情况?
- 2. 如何在VB 6中获取当前的CPU和RAM使用情况?
- 3. 获取C#中当前CPU,RAM和磁盘驱动器的使用情况
- 4. 使用WMI获取C#中每个进程的CPU和RAM使用情况?
- 5. 如何使用.NET CORE获取C#Web应用程序当前的CPU/RAM /磁盘使用情况?
- 6. 在asp.net框架中使用c#获取当前cpu使用情况
- 7. 使用ruby或cli获取当前的cpu使用情况
- 8. 如何使用PowerShell查找CPU和RAM使用情况?
- 9. 如何获取C#(托管代码)中的* THREAD *的CPU使用率和/或RAM使用情况?
- 10. 在Android上获取CPU,RAM和网络使用情况统计信息
- 11. 通过Java获得当前JVM的真实RAM使用情况
- 12. AS400 jt400获取RAM使用情况
- 13. 如何获取我的程序使用的RAM和CPU?
- 14. Python:如何获取当前的带宽使用情况?
- 15. 如何获得Apache Cordova中的CPU和内存使用情况?
- 16. 如何在Android上获取CPU使用情况统计信息?
- 17. 如何从aws服务器详细信息(如cpu ram和硬盘使用情况)获取实时数据
- 18. 度量以计算和比较Android中的RAM和CPU使用情况
- 19. Socket.io CPU和Ram的使用
- 20. 如何从Java获取系统加载/ CPU使用情况?
- 21. 确定Silverlight 4 Windows Sidebar小工具中的CPU和RAM使用情况
- 22. C#查询远程计算机的资源使用情况(即CPU负载,RAM使用情况)
- 23. 在shell脚本中获取CPU使用情况?
- 24. 在C#中获取设备的CPU利用率和WinCE上的可用RAM
- 25. 获取当前进程的CPU使用率用C
- 26. 如何获取WIndows Phone 7的CPU和内存使用情况统计信息?
- 27. 如何限制C#中的CPU使用情况#
- 28. 如何在Java中检查CPU和内存使用情况?
- 29. Python - 在窗口中获取进程名称,CPU,内存使用情况和峰值内存使用情况
- 30. 可靠地监视当前CPU使用情况
为什么这会伤心? CPU/RAM/NUMA /(在此插入一个或多个首字母缩略词)使得平台独立报告机制有所限制。 – MSN 2009-01-28 16:45:21