Почему результаты профилирования памяти CRT и VS такие разные? - PullRequest
0 голосов
/ 04 февраля 2020

Традиционно я использовал функции отчетов о памяти ЭЛТ, например:

    _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 (), затем посмотрите на результаты сравнения.

Теперь я использовал оба одновременно и сравнил результаты. Я ожидал, что оба результата будут примерно одинаковыми, если не совсем одинаковыми. Но это не так. Размеры памяти сильно различаются. Единственное, что они разделяют, это количество выделений. Я не знаю, что с этим делать. Как я должен интерпретировать эти результаты? Что вызывает разницу? Кому я должен доверять?

Обратите внимание, что результаты CRT не зависят от того, включено профилирование кучи или нет.

1 Ответ

0 голосов
/ 18 февраля 2020

Так что, похоже, профилирование памяти не является ни точной наукой, ни очень популярной.

Краткий ответ на мой собственный вопрос: просто выберите любой тип измерения, затем придерживайтесь его и сравните абстрактные числа для каждого измерения, которое вы проводите. Но никогда не задумывайтесь над тем, что могут означать эти цифры.

К вашему сведению, вот что я исследовал:

  • Различение снимков с помощью _CrtMemCheckpoint / _CrtMemDifference.
  • Кроме того _CrtSetAllocЗдесь отследить общее выделение во время выполнения задачи, потому что _CrtMemState lHighWaterCount (пик с момента запуска приложения, а не с момента последнего снимка) и lTotalCount (переполнения, иногда странные сбои) не являются надежными. К сожалению, _CrtSetAllocHook не позволяет вам сопоставлять выделения и освобождения.
  • GetProcessHeap / HeapSummary для проверки кучи процесса по умолчанию.
  • GetProcessMemoryInfo выдает те же числа, что и HeapSummary, но, конечно, не то же самое , Иногда между ними есть даже большой разрыв. Очевидно, GetProcessMemoryInfo также предоставляет значения, которые вы видите в Windows 'TaskManager.

В конце я использовал отладку _CrtMemCheckpoint, _CrtMemDifference и _CrtSetAllocHook, потому что я чувствовал, что могу интерпретировать эти числа. Однако эти функции недоступны в выпуске, поэтому я использовал там GetProcessMemoryInfo. Не имел понятия, как интерпретировать эти цифры, но каждый раз, когда они падали из-за моих оптимизаций, они давали мне счастливое лицо.

...