如何在C ++中获得当前的CPU和RAM使用率?

时间:2009-01-26 13:03:41

标签: c++ cpu-usage ram

在C ++中,是否有可能获得当前的RAM和CPU使用率?是否存在平台无关的函数调用?

9 个答案:

答案 0 :(得分:30)

可悲的是,这些东西严重依赖于底层操作系统,因此没有与平台无关的调用。 (也许有一些包装框架,但我不知道。)

在Linux上,您可以查看getrusage()函数调用,在Windows上,您可以使用GetProcessMemoryInfo()进行RAM使用。还要查看Windows Process Status API中的其他功能。

答案 1 :(得分:11)

我知道没有与平台无关的功能。如果您计划针对多个版本的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;
}

答案 2 :(得分:11)

有一个开源库可以跨多个平台提供这些(以及更多系统信息):SIGAR API

我在相当大的项目中使用它并且工作正常(除了OS X上的某些极端情况等)。

答案 3 :(得分:5)

不,没有,不在标准中。

如果您确实需要此信息,则必须编写特定于平台的#ifdefs或链接到提供它的库。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

没有独立于平台的方法来做到这一点。虽然对于Windows,您可以通过在代码中使用PDH.dll(Performance Data Helper)及其相关API来获取CPU使用率和性能指标。

Here's more on how to use it.

答案 6 :(得分:0)

不直接。

但您可以使用抽象操作系统的库(例如ACE) 如果你只想要CPU和内存,这可能会有点沉重。

答案 7 :(得分:0)

如果仍然如此,请检查:

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

它给出了一个如何获得Linux(在Debian和CentOS上测试)的CPU和RAM使用的示例,以及如何安装的非常简单的说明。

如果您对这个小项目有任何疑问,请随时询问。

答案 8 :(得分:0)

我注意到ACE已移植到vcpkg,这将使编译和链接跨平台C ++应用程序变得容易。

在C ++中,我想监视可用的系统CPU和内存资源,以便我的应用可以根据资源可用性灵活地使用它。

有人可以提供ACE代码片段来开始使用此代码吗?