Сбросить PeakWorkingSetSize - PullRequest
       6

Сбросить PeakWorkingSetSize

0 голосов
/ 21 января 2020

В настоящее время я ищу способ измерить пиковое потребление памяти несколькими C функциями. Эти функции являются частью устаревших библиотек C без исходного кода. Моя цель - измерить, какой из них потребляет меньше всего памяти. В настоящее время я использую поле PeakWorkingSetSize, возвращаемое вызовом GetProcessMemoryInfo WinAPI (c .f. https://docs.microsoft.com/de-de/windows/win32/psapi/collecting-memory-usage-information-for-a-process). К сожалению, кажется, нет простого способа сбросить этот счетчик. Если бы он был, я бы просто сделал следующее:

int peak = getPeak();
functionCall1();
int d1 = getPeak() - peak;
resetPeak();
peak = getPeak();
functionCall2();
int d2 = getPeak() - peak;
resetPeak();
peak = getPeak();
functionCall3();
int d3 = getPeak() - peak;

Кто-нибудь знает способ сброса этого счетчика или знает другой подход для решения моей проблемы. Меня не заставляют Windows, однако было бы здорово, если бы было решение для windows. Кроме того, результат не должен быть грубым, оценка - совершенно нормально.

1 Ответ

0 голосов
/ 22 января 2020

Вы не можете сбросить его. Но вы можете использовать CreateProcess для каждого вызова функции. В качестве примера возьмем 3 функции:

getpeak.exe:

#include <windows.h>
#include <stdio.h>
#include <psapi.h>

int getPeak()
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;
    if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))
    {
        return pmc.PeakWorkingSetSize;
    }
    return 0;
}
void functionCall1()
{
    //To Do
}
void functionCall2()
{
    //To Do
}
void functionCall3()
{
    //To Do
}
int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        printf("format: \"getpeak.exe index\"\n");
    }
    int peak = getPeak();
    switch (atoi(argv[1]))
    {
    case 1:
        functionCall1();
        break;
    case 2:
        functionCall2();
        break;
    case 3:
        functionCall3();
        break;
    default:
        printf("Invaild function index\n");
        break;
    }
    int d = getPeak() - peak;
    return d;
}

Вызов CreateProcess для каждого вызова функции, например:

#include <Windows.h>
#include <iostream>

int main()
{
    DWORD d1 = 0, d2 = 0, d3 = 0;
    TCHAR cmd[3][20] = {"getpeak.exe 1","getpeak.exe 2","getpeak.exe 3"};
    STARTUPINFO si = { 0 };
    si.cb = sizeof(STARTUPINFO);
    PROCESS_INFORMATION pi = { 0 };
    if (CreateProcess(NULL, cmd[0], NULL, NULL, false, 0, NULL, NULL, &si, &pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        GetExitCodeProcess(pi.hProcess, &d3);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }

    if (CreateProcess(NULL, cmd[1], NULL, NULL, false, 0, NULL, NULL, &si, &pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        GetExitCodeProcess(pi.hProcess, &d2);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }

    if (CreateProcess(NULL, cmd[2], NULL, NULL, false, 0, NULL, NULL, &si, &pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);
        GetExitCodeProcess(pi.hProcess, &d3);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }

    return 0;
}

(Удалить часть ошибки проверка)

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