Heaptrack профилировщик использования памяти кучи. Heaptrack использует LD_PRELOAD для отслеживания всех основных вызовов функции выделения памяти и регистрирует их события.

Это может дать интересные ответы на такие вопросы, как:

  • Сколько памяти кучи использует мое приложение?
  • Где и как часто выделяется память кучи?
  • Сколько места запрашивают отдельные распределения кучи?

Чтобы оценить сгенерированные данные heaptrack, используйте heaptrack_print или heaptrack_gui.

Установка программы heaptrack

sudo apt install heaptrack

Графическое приложение heaptrack_gui можно установить через центр приложений Ubuntu.

Heaptrack отслеживает все выделения памяти и комментирует эти события с помощью трассировок стека. Затем инструменты анализа heaptrack_gui позволяют интерпретировать профиль памяти кучи следующим образом:

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

Сравним две программы, два алгоритма вычисления факториала с тоски зрения использования памяти компьютера.

Вычисление факториала числа методом итераций:

#include <iostream>

unsigned long Factorial(int N)
{
  unsigned long F = 1;
  for (; N > 1; N--) {
    F = F * N;
  }
  return F;
}

int main()
{
  std::cout << "20! = " << Factorial(20) << std::endl;
  return 0;
}

Вычисление факториала числа методом рекурсии:

#include <iostream>

unsigned long Factorial(int N)
{
  unsigned long F;
  if (N == 1) {
    F = 1;
  }
  else {
    F = N * Factorial(--N);
  }
  return F;
}

int main()
{
  std::cout << "20! = " << Factorial(20) << std::endl;
  return 0;
}

Скомпилируем обе программы

g++ -o iteration iteration.cpp
g++ -o recursion recursion.cpp

В результате получили два исполняемых файла (программы) ровно по 9 016 байт.

Обе программы запустим через профилировщик heaptrack

heaptrack ./iteration
heaptrack output will be written to "/home/dior/Документы/CPP/Иттерация и рекурсия/heaptrack.iteration.9178.gz"
starting application, this might take some time...
20! = 2432902008176640000
Failed to create backtrace state for module /home/dior/Документы/CPP/Иттерация: /home/dior/Документы/CPP/Иттерация / No such file or directory (error code 2)
heaptrack stats:
	allocations:          	2
	leaked allocations:   	0
	temporary allocations:	0
Heaptrack finished! Now run the following to investigate the data:

  heaptrack --analyze "/home/dior/Документы/CPP/Иттерация и рекурсия/heaptrack.iteration.9178.gz"
heaptrack ./recursion
heaptrack output will be written to "/home/dior/Документы/CPP/Иттерация и рекурсия/heaptrack.recursion.9198.gz"
starting application, this might take some time...
20! = 2432902008176640000
Failed to create backtrace state for module /home/dior/Документы/CPP/Иттерация: /home/dior/Документы/CPP/Иттерация / No such file or directory (error code 2)
heaptrack stats:
	allocations:          	2
	leaked allocations:   	0
	temporary allocations:	0
Heaptrack finished! Now run the following to investigate the data:

  heaptrack --analyze "/home/dior/Документы/CPP/Иттерация и рекурсия/heaptrack.recursion.9198.gz"

Отчёты, сформированные программой heaptrack в формате gz загрузим в программу с графическим интерфейсом heaptrack_gui

heaptrack_gui heaptrack.iteration.10046.gz

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