How to determine CPU and memory consumption from inside a process? (9个答案)
3年前关闭。
看,我想衡量我的C++程序的内存使用情况。从程序内部,没有探查器或进程查看器等。
为什么从程序内部? 测量将完成数千次-必须自动进行;因此,关注Task Manager
,top
等等,都不会成为将在生产运行期间进行测量 -由性能分析器引起的性能下降是 Not Acceptable ,因为运行时间已经可以忽略不计了(大型问题实例需要几个小时) 注意。为什么要测量? 相对于预先计算“预期”使用情况来衡量已用内存(由操作系统报告)的唯一原因是,我无法直接分析“
sizeof
”我的主要数据结构使用了多少。结构本身是
unordered_map<bitset, map<uint16_t, int64_t> >
这些都是我关心的打包成
vector
的格式(实际上
list
也足够了,我只需要访问“邻居”结构;如果没有内存使用的详细信息,我几乎无法决定选择哪个)
vector< unordered_map<bitset, map<uint16_t, int64_t> > >
因此,如果有人知道如何“调整”这种结构所占用的内存,那也将解决问题(尽管我可能不得不提出这个问题或其他东西)。
环境:可以假定该程序全部在给定的机器上运行(当然还有OS等;当然是PC或 super 计算机的节点);它肯定是唯一需要大量内存(例如512 MiB)的程序-计算实验环境。该程序可以在我的家用PC(16GiB RAM; Windows 7或Linux Mint 18.1)或机构 super 计算机的节点(大约100GiB RAM,CentOS 7)上运行,并且程序
可能希望占用所有这些RAM。
请注意,该 super 计算机有效地禁止了用户进程的磁盘交换,并且我的家用PC的页面文件很小。
内存使用模式。 可以说该程序按顺序填充了一种表格,其中每一行是上面指定的
vector<...>
。假设主要数据结构称为
supp
。然后,对于每个整数
k
,要填充
supp[k]
,则需要
supp[k-1]
中的数据。填充
supp[k]
时,它用于初始化
supp[k+1]
。因此,每次都必须易于访问
此,
上一个和
下一个“表行”。填满表格后,程序会在表格中进行相对较快的(与“初始化”并填充表格相比)非穷举搜索,从而获得解决方案。
请注意,该内存仅通过
STL
容器分配,我自己从来没有明确地使用
new()
或
malloc()
。
问题。妄想。 有什么合适的方法可以从其源代码内部(一个用于Windows,一个用于Linux)来衡量一个进程的总内存使用量(包括交换到磁盘)? 应该是另一个问题,或者是一个很好的谷歌搜索 session ,但是仍然-明确控制(例如鼓励或劝阻)交换到磁盘的正确(或简单)方法是什么?希望获得有关该主题的权威书籍的指针。再一次,请原谅我的无知,我想用一种方式在“从不交换supp
”的行上说些什么,或者
“交换supp[10]
”;然后,在需要时,“unswap supp[10]
”-全部从程序的代码中进行。我以为我必须决定序列化数据结构并将其显式存储为二进制文件,然后逆转转换。 在Linux上,似乎最简单的方法是仅通过sbrk(0)捕获堆指针,将其转换为64位无符号整数,并在分配内存后计算差值,这种方法产生了合理的结果(没有做得更严格)测试呢)。
编辑。5. 删除了对
HeapAlloc
争用的引用-不相关。
编辑4. Windows解决方案此段代码报告与任务管理器中的工作集匹配的工作集;那就是我想要的全部东西–在Windows 10 x64上进行了测试(通过
new uint8_t[1024*1024]
或
new uint8_t[1ULL << howMuch]
之类的分配进行了测试,尚未在我的“生产”中进行测试)。
在Linux上,我会尝试使用
getrusage
或其他方法来获得等效的代码。
主元素是
GetProcessMemoryInfo
,如@IInspectable和@conio所建议
#include<Windows.h>
#include<Psapi.h>
//get the handle to this process
auto myHandle = GetCurrentProcess();
//to fill in the process' memory usage details
PROCESS_MEMORY_COUNTERS pmc;
//return the usage (bytes), if I may
if (GetProcessMemoryInfo(myHandle, &pmc, sizeof(pmc)))
return(pmc.WorkingSetSize);
else
return 0;
编辑。5. 删除对
GetProcessWorkingSetSize
的不相关引用。谢谢@conio。