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
К сожалению, заметных различий в работе этих двух программ нет, поэтому мы привели только один отчёт.