Ответ 1
Вы пробовали Valgrind? Это инструмент для профилирования для Linux. У него есть программа проверки памяти (для утечек памяти и других проблем с памятью) под названием Memcheck, но у нее также есть куча профилировщика с именем Massif.
Я пишу приложение, и я удивлен, увидев, что его общее использование памяти уже слишком велико. Я хочу рассказать об использовании динамической памяти в моем приложении: сколько объектов каждого типа есть в куче, а какие функции создавали эти объекты? Кроме того, сколько памяти используется каждым объектом?
Есть ли простой способ сделать это? Я работаю над linux и windows, поэтому инструментов любой из платформ хватит.
ПРИМЕЧАНИЕ. Я не занимаюсь утечками памяти здесь.
Вы пробовали Valgrind? Это инструмент для профилирования для Linux. У него есть программа проверки памяти (для утечек памяти и других проблем с памятью) под названием Memcheck, но у нее также есть куча профилировщика с именем Massif.
Для простой статистики, чтобы узнать, где используется вся память, вы можете добавить такой шаблон:
template<class T>
class Stats {
static int instance_count;
public:
Stats() {
instance_count++;
}
~Stats() {
instance_count--;
}
static void print() {
std::cout << instance_count << " instances of " << typeid(T).name() <<
", " << sizeof(T) << " bytes each." << std::endl;
}
};
template<class T>
int Stats<T>::instance_count = 0;
Затем вы можете добавить это как базовый класс к классам, которые, как вы подозреваете, имеют множество экземпляров, и распечатать статистику использования текущей памяти:
class A : Stats<A> {
};
void print_stats() {
Stats<A>::print();
Stats<B>::print();
...
}
Это не показывает вам, в каких функциях были выделены объекты, и не дает слишком много деталей, но мне может быть достаточно, чтобы найти, где пропала память.
Для окон проверьте функции в "crtdbg.h". crtdbg.h содержит отладочную версию функций распределения памяти. Он также содержит функцию для обнаружения утечек памяти, сбоев, проверки правильности указателей кучи и т.д.
Я думаю, что следующие функции будут полезны для вас.
_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince
В следующих списках ссылок MSDN представлены функции отчета о состоянии кучи и пример кода http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx
Вы можете попробовать Memory Validator от http://www.softwareverify.com/cpp/memory/index.html
Это один из лучших инструментов, с которыми я столкнулся для профилирования использования памяти. 30-дневная ознакомительная версия доступна для бесплатной загрузки.
Есть несколько вещей, которые вы можете сделать. Самое простое - связать библиотеку debug malloc; в зависимости от деталей вашей среды (например, google для _malloc_dbg для Windows) доступно несколько из них.
Второй выбор заключается в том, что вы можете перегружать новые и удалять в С++; возможно перегрузить базовые новые и удалить новыми функциями, которые отслеживают распределение и использование памяти.
MTuner - бесплатный профайлер памяти C/С++. Описание ниже:
MTuner - это профилирование памяти с несколькими платформами, средство обнаружения и анализа утечек, поддерживающее компиляторы MSVC, GCC и Clang. Особенности включают в себя: хронологию истории активности памяти, мощную фильтрацию, SDK для ручной аппаратуры с полным исходным кодом, поддержку непрерывной интеграции через использование командной строки, обнаружение утечки памяти и многое другое. Профилируйте любое программное обеспечение, нацеленное на платформы с помощью компиляторов GCC или Clang. Поставляется со встроенной поддержкой платформ Windows, PlayStation 4 и PlayStation 3 и платформы, ориентированной на кросс-компилятор на базе Windows.
Я только что выпустил профайлер памяти MemPro win32 в качестве бесплатной бета-версии. http://www.puredevsoftware.com/MemPro.htm. Он перехватывает новые/удаляет и отправляет данные во внешнее приложение, где вы можете просматривать распределения различными способами. Надеюсь, это поможет.
В предыдущем задании мы использовали инструмент под названием "Очистить". Это продукт Rational/IBM. Я не думаю, что это бесплатный инструмент, но я помню, что это очень хорошо. Вот некоторая информация:
Глава 1.10 из Game Gems Volume 2 (Ссылка Amazon) подробно описывает простой, но эффективный диспетчер памяти Debug Memory от Peter Dalton, который обеспечивает достойный набор статистических данных при выгрузке журнала.
Глава 4.6 из Game Gems Volume 8 (ссылка для просмотра Safari Book) содержит подробный профилировщик памяти Ricky Lung, который может отображать выделение статистики в иерархическом стиле вызовов и все же поддерживают многопоточность.
Просто увидели на сайт AQtime, что у них хорошая поддержка "Профилирование распределения".
Попробуйте gperftools - он может:
Кроме того, это почти не влияет на эффективность программы.