Как получить текущее использование процессора и оперативной памяти в C ++? - PullRequest
29 голосов
/ 26 января 2009

возможно ли в C ++ получить текущее использование памяти и процессора? Есть ли независимый от платформы вызов функции?

Ответы [ 8 ]

30 голосов
/ 26 января 2009

К сожалению, эти вещи в значительной степени зависят от базовой ОС, поэтому нет вызовов, не зависящих от платформы. (Может быть, есть какие-то рамки-оболочки, но я не знаю ни одной.)

В Linux вы можете взглянуть на вызов функции getrusage () , в Windows вы можете использовать GetProcessMemoryInfo () для использования ОЗУ. Посмотрите также на другие функции в API статуса процесса Windows.

11 голосов
/ 28 января 2009

Существует библиотека с открытым исходным кодом, которая предоставляет эти (и другие сведения о системе) на многих платформах: SIGAR API

Я использовал его в довольно больших проектах, и он отлично работает (за исключением некоторых случаев в OS X и т. Д.)

11 голосов
/ 26 января 2009

Для этого не существует независимой от платформы функции, о которой я знаю. Если вы планируете использовать несколько версий Windows, имейте в виду, что реализация зависит от версии. Я столкнулся с этой проблемой при тестировании приложения под NT 3.51, например ... (архаично, я знаю).

Вот код, который я использовал для памяти. Это не работает на платформах, отличных от Windows, и просто возвращает 0 при компиляции без определения WIN32:

РЕДАКТИРОВАТЬ: я забыл упомянуть, этот код делится и округляется до ближайшего МБ, следовательно, >> 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;
}
5 голосов
/ 26 января 2009

Нет, нет, не в стандарте.

Если вам действительно нужна эта информация, вам придется написать специфичные для платформы #ifdefs или ссылку на библиотеку, которая ее предоставляет.

2 голосов
/ 05 июня 2011

В 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();
}
1 голос
/ 27 января 2009

Нет независимого от платформы способа сделать это. Хотя для Windows вы можете получить показатели использования ЦП и производительности, используя PDH.dll (Performance Data Helper) и связанные с ним API в своем коде.

Подробнее о том, как его использовать.

0 голосов
/ 05 февраля 2013

Если это все еще так, пожалуйста, проверьте:

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

В нем приведен пример того, как получить использование ЦП и ОЗУ в Linux (протестировано на Debian и CentOS), и довольно простая инструкция по установке.

Пожалуйста, не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы относительно этого небольшого проекта.

0 голосов
/ 26 января 2009

Не напрямую.

Но вы можете использовать библиотеку, которая абстрагирует ОС (например, ACE).
Хотя это может быть немного тяжело, если вы просто хотите процессор и память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...