c - 重置 PeakWorkingSetSize

标签 c windows winapi memory

我目前正在寻找一种方法来测量多个 C 函数的峰值内存消耗。这些函数是遗留 C 库的一部分,没有可用的源代码。 我的目标是衡量其中哪一个的内存消耗最低。目前,我正在使用 WinAPI 的 GetProcessMemoryInfo 调用返回的 PeakWorkingSetSize 字段(参见 https://learn.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的解决方案那就太好了。另外,结果不必粗略估计就完全没问题。

最佳答案

您无法重置它。但你可以使用 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;
}

(删除部分错误检查)

关于c - 重置 PeakWorkingSetSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59841365/

相关文章:

c - 如何用(可读的)UTF8 字符写入文件?

c - OpenMP 自定义缩减变量

c++ - 为什么使用数组大小​​ 1 而不是指针?

c - C 中的 UDP 监听器未输出正确的十六进制信息

windows - 在 Windows 上通过 node.js 执行 git cmd 失败并出现错误

windows - Windows XP 中的符号链接(symbolic link)

c++ - 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?

windows - 如何获取 RDP session 的 Windows 主机 key ?

c++ - 是否有可能获得由 'new' 分配的内存块大小?

java - 从 Java 进行 DDE 调用