Jak uzyskać aktualne zużycie procesora i pamięci RAM w C++?

Czy w C++ możliwe jest pobranie bieżącego zużycia pamięci RAM i procesora? Czy istnieje funkcja niezwiązana z platformą?

Author: BradleyDotNET, 2009-01-26

8 answers

Istnieje biblioteka open source, która daje te (i więcej informacji o systemie) na wielu platformach: SIGAR API

Używałem go w dość dużych projektach i działa dobrze (poza pewnymi przypadkami na OS X itp.)

 11
Author: ididak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 08:40:02

Niestety te rzeczy w dużej mierze zależą od bazowego systemu operacyjnego, więc nie ma wywołań niezależnych od platformy. (Może są jakieś frameworki, ale nie znam żadnych.)

W Linuksie można spojrzeć na wywołanie funkcji getrusage () , W Windows można użyć GetProcessMemoryInfo () do użycia pamięci RAM. Zobacz także inne funkcje w Process Status API systemu Windows.

 30
Author: Kosi2801,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 13:17:40

Nie ma funkcji niezależnej od platformy, o której wiem. Jeśli planujesz kierować wiele wersji systemu Windows, pamiętaj, że implementacja różni się w niektórych wersjach. Trafiłem na ten problem podczas testowania aplikacji pod NT 3.51 na przykład... (archaiczne, wiem).

Oto kod, którego użyłem do pamięciowej strony rzeczy. Nie działa to na innych platformach niż windows, a po prostu zwróci 0, gdy zostanie skompilowany bez zdefiniowania WIN32:

EDIT: zapomniałem wspomnieć, że ten kod dzieli się i zaokrągla do najbliższego MB, stąd > > 20 wszędzie.

// 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;
}
 11
Author: jheriko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 16:31:35

Nie, Nie ma, nie w standardzie.

Jeśli naprawdę potrzebujesz tych informacji, będziesz musiał napisać specyficzne dla platformy #ifdefs lub link przeciwko bibliotece, która je dostarcza.

 5
Author: HUAGHAGUAH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 13:13:17

W Linuksie użyje /proc / self / status . Potrzeba więcej pracy, aby przekształcić to w numer. Uważam to za przydatne, ponieważ jest to jednak, po prostu wydrukować użycie pamięci bezpośrednio na ekranie jako ciąg znaków.

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();
}
 2
Author: Aaron McDaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 04:59:10

Nie ma na to niezależnego od platformy sposobu. Chociaż w systemie windows możesz uzyskać wskaźniki wykorzystania procesora i wydajności za pomocą PDH.dll (Performance Data Helper) i powiązane z nim API w kodzie.

Oto więcej o tym, jak go używać.

 1
Author: Samrat Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 08:55:27

Nie bezpośrednio.

Ale możesz użyć biblioteki, która abstrahuje od systemu operacyjnego (takiej jak ACE).
Chociaż może to być nieco ciężkie, jeśli chcesz tylko procesor i pamięć.

 0
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 16:41:11

Jeśli tak jest, SPRAWDŹ:

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

To daje przykład jak uzyskać CPU i pamięci RAM z Linuksa (testowane na Debianie i CentOS) i dość prostą instrukcję jak zainstalować.

Jeśli masz jakiekolwiek pytania dotyczące tego małego projektu, prosimy o kontakt.

 0
Author: Bartosz Pachołek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 10:52:06