为啥 CRT 和 VS 内存分析的结果如此不同?

Posted

技术标签:

【中文标题】为啥 CRT 和 VS 内存分析的结果如此不同?【英文标题】:Why are results of CRT and VS memory profiling so different?为什么 CRT 和 VS 内存分析的结果如此不同? 【发布时间】:2020-02-04 17:02:46 【问题描述】:

传统上我使用过这样的 CRT 内存报告功能:

    _CrtMemState state[3];
    _CrtMemCheckpoint(&state[0]);
    foo();
    _CrtMemCheckpoint(&state[1]);
    int const diff = _CrtMemDifference(&state[2], &state[0], &state[1]);
    _CrtMemDumpStatistics(&state[2]);

最近我使用了 Visual Studio 的内置堆分析工具和快照。在 foo() 之前创建第一个快照,在 foo() 之后创建第二个快照,然后查看 diff 输出。

现在我同时使用了两者并比较了结果。我希望这两个结果几乎相同,如果不完全相同的话。但这种情况并非如此。内存大小差异很大。他们唯一共享的是分配的数量。我不知道该怎么做。我应该如何解释这些结果?造成差异的原因是什么?我应该相信谁?

请注意,CRT 结果与是否启用堆分析无关。

【问题讨论】:

【参考方案1】:

因此,内存分析似乎既不是一门精确的科学,也不是一门非常流行的科学。

对我自己的问题的简短回答:只需选择任何类型的测量,然后坚持使用它并比较您进行的每个测量的抽象数字。但永远不要开始怀疑这些数字可能意味着什么。

仅供参考,这是我探索的内容:

按 _CrtMemCheckpoint / _CrtMemDifference 进行快照差异。 另外 _CrtSetAllocHook 用于跟踪任务期间的总分配,因为 _CrtMemState 的 lHighWaterCount(自应用程序启动以来的峰值,而不是自上次快照以来的峰值)和 lTotalCount(溢出,有时是奇怪的故障)不可靠。遗憾的是,_CrtSetAllocHook 无法让您匹配分配和解除分配。 GetProcessHeap / HeapSummary 检查默认进程堆。 GetProcessMemoryInfo 产生与 HeapSummary 相似的数字,但当然不一样。有时,两者之间甚至有很大的差距。显然 GetProcessMemoryInfo 还提供了您在 Windows 的 TaskManager 中看到的值。

最后,我在调试中使用了_CrtMemCheckpoint、_CrtMemDifference 和_CrtSetAllocHook,因为我觉得我可以解释这些数字。但是,这些功能在发布时不可用,所以我在那里使用了 GetProcessMemoryInfo。不知道如何解释这些数字,但每次因为我的优化而下降时,他们都会给我一张快乐的脸。

【讨论】:

以上是关于为啥 CRT 和 VS 内存分析的结果如此不同?的主要内容,如果未能解决你的问题,请参考以下文章

VS下关于 _CRT_SECURE_NO_WARNINGS 问题的分析与解决

vs内存里面为啥全是?

为啥 Visual Studio CRT 内存报告显示 CRT 块

可以通过以下方式将结构转换为不同的大小吗?

Google Location API vs. Maps:为啥相同的查询会产生不同的结果?

为啥萨摩亚的 pytz 和 dateutil 得到不同的结果?