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

问题描述 投票:0回答:1

传统上,我已经使用过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结果与是否启用堆概要分析无关。

visual-studio memory profiling crtdbg.h
1个回答
0
投票

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

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

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

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

最后,我在调试中使用了_CrtMemCheckpoint,_CrtMemDifference和_CrtSetAllocHook,因为我认为我可以解释这些数字。但是,这些功能在发行版中不可用,因此我在那里使用了GetProcessMemoryInfo。不知道如何解释这些数字,但是每次它们由于我的优化而崩溃时,它们都会给我一张快乐的脸。

© www.soinside.com 2019 - 2024. All rights reserved.