gpt4 book ai didi

c - 重置 PeakWorkingSetSize

转载 作者:行者123 更新时间:2023-11-30 16:06:48 26 4
gpt4 key购买 nike

我目前正在寻找一种方法来测量多个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com