Как я могу отслеживать частоту и объем доступа к памяти в приложении C ++ во время профилирования памяти?

Я пытаюсь уменьшить объем памяти приложения C ++. Со временем использование памяти этим приложением возросло благодаря разработчикам, создающим новые дублированные представления данных в памяти для различных целей.

Я хотел бы определить, как часто к этим двойным представлениям данных обращаются, чтобы я мог решить, делать их кратковременными или создавать при доступе, чтобы уменьшить пиковый размер кучи.

Поэтому мой вопрос — как лучше всего отслеживать не только размер и объем памяти, но также частота и объем доступ кучи памяти? Я знаю, что все базовые профилировщики памяти обрабатывают информацию о распределении — корреляция с доступом к памяти — это то, что меня интересует.

Идеальный ответ был бы независимым от платформы, так как это приложение работает на Windows, Linux, iOS и Android. Однако я приму ответы, которые работают на любой из этих платформ и для любой архитектуры процессора, обычно используемой этими платформами, поскольку у нас нет поведения, специфичного для платформы, которое должно влиять на подобные вещи.

1

Решение

Как это было прокомментировано, ваш вопрос очень широк.

Я не могу ответить на него определенным образом, но я предполагаю, что у вас есть доступ к исходному коду, вы можете скомпилировать его с помощью gcc, и ваша платформа поддерживает Valgrind. Если мои предположения неверны, пожалуйста, обновите ваш вопрос, так как ниже приведено грубое руководство по массиву Вальгринда, но это было не то, о чем просили.

  1. Установить Valgrind
  2. Скомпилируйте вашу программу с -g и -O0
  3. Запустите вашу программу с valgrind --tool=massif your.exe
  4. После завершения выполнения инструмент массива создаст файл с именем massif.out. [PID]
  5. Запустите команду ms_print massif.out.[PID]

Это даст график, показывающий потребление памяти и подробную информацию обо всех точках выделения в программе, включая точку пикового выделения памяти.

Если вы хотите отслеживать доступ к памяти, вы можете использовать инструмент DHAT (см. эта ссылка для подробных инструкций):

  1. Как и с массивом, скомпилируйте вашу программу с -g и -O0
  2. Запустите вашу программу с valgrind --tool=exp-dhat your.exe
3

Другие решения

Два момента:

1) Если вы ищете утечки памяти (которые могут быть очень медленными), способ сделать это — использовать один из методов, чтобы увидеть, какие блоки памяти не были освобождены после завершения программы. Это позволяет вам выяснить, откуда они пришли и почему они не были освобождены.

2) Если это вопрос чрезмерного выделения памяти (и освобождения), я обнаружил, что это сопровождается большой долей время потратил на это. Так что это не просто проблема с памятью, это проблема производительности, и их легко найти. Вот пример.

Обратите внимание, это немного отличается от того, что вы просили.
Вы спросили, как отслеживать распределение памяти, чтобы можно было найти те, которые можно было бы исключить.
Эта техника находит их напрямую, без прохождения части отслеживания.
Способ, который работает, заключается в том, что выделение и освобождение памяти требует больших вычислительных ресурсов, поэтому обычно приходится учитывать большую долю циклов, поэтому выборки случайного времени легко раскрывают это.

1

По вопросам рекламы [email protected]