sirven - Perfilado de asignación de memoria en C++
que es un apuntador en c (12)
Estoy escribiendo una aplicación y me sorprende ver que su uso total de la memoria ya es demasiado alto. Quiero hacer un perfil del uso de la memoria dinámica de mi aplicación: ¿cuántos objetos de cada tipo hay en el montón y qué funciones crearon? Además, ¿cuánta memoria usa cada objeto?
¿Hay una manera simple de hacer esto? Estoy trabajando tanto en Linux como en Windows, por lo que las herramientas de cualquiera de las plataformas serían suficientes.
NOTA: No me preocupan las pérdidas de memoria aquí.
¿Has probado Valgrind ? Es una herramienta de creación de perfiles para Linux. Tiene un corrector de memoria (para pérdidas de memoria y otros problemas de memoria) llamado Memcheck pero también tiene un perfilador de montón llamado Massif.
Acabo de lanzar un Mem32 de memoria nativo win32, como una versión beta gratuita. http://www.puredevsoftware.com/MemPro.htm . Se engancha en new / delete y envía datos a una aplicación externa donde puede ver las asignaciones de diferentes maneras. Espero que esto sea de ayuda.
Acabo de ver en el sitio de AQtime que tienen un buen soporte para "perfiles de asignación".
El Capítulo 1.10 de Game Programming Gems Volume 2 ( enlace de Amazon ) detalla un Administrador de memoria de depuración simple pero efectivo de Peter Dalton que proporciona un conjunto de estadísticas decente cuando se descarga el registro.
El Capítulo 4.6 de Game Programming Gems Volume 8 (enlace de vista previa de Safari Book) detalla un perfilador de memoria avanzado de Ricky Lung que puede mostrar la estadística de asignación de una manera jerárquica de pila de llamadas y, sin embargo, admite multi-threading.
En un trabajo anterior usamos una herramienta llamada "Purificar". Es un producto hecho por Rational / IBM. No creo que esta sea una herramienta gratuita, pero recuerdo que es bastante buena. Aquí hay algo de información:
Hay varias cosas que puedes hacer. Lo más simple es vincular una biblioteca de depuración malloc; hay varios de ellos disponibles, dependiendo de los detalles de su entorno (p. ej., google para _malloc_dbg para Windows).
La segunda opción es que puede sobrecargar y borrar en C ++; es posible sobrecargar el nuevo básico y eliminar con nuevas funciones que rastrean la asignación y el uso de la memoria.
Para Windows, verifique las funciones en "crtdbg.h". crtdbg.h contiene la versión de depuración de las funciones de asignación de memoria. También contiene funciones para detectar fugas de memoria, daños, comprobar la validez de los punteros del montón, etc.
Creo que las siguientes funciones te serán útiles.
_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince
El siguiente enlace de MSDN enumera las funciones de informes de estado de montón y el código de ejemplo http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx
Para estadísticas simples, solo para saber dónde se usa toda la memoria, puede agregar una plantilla como esta:
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;
Luego puede agregar esto como una clase base a las clases que sospecha que tienen muchas instancias, e imprimir estadísticas del uso actual de la memoria:
class A : Stats<A> {
};
void print_stats() {
Stats<A>::print();
Stats<B>::print();
...
}
Esto no le muestra en qué funciones se asignaron los objetos y no proporciona demasiados detalles, pero podría ser suficiente para localizar dónde se desperdicia la memoria.
Prueba los gperftools , puede:
- perfila partes específicas de código o todo el programa a la vez.
- Representar datos a través de gráficos visuales que muestran las llamadas a funciones exactas y su herencia.
- centrarse en regiones específicas de código en un gráfico visual.
- mostrar diff entre los volcados.
- muestra espacio asignado en lugar de usado; todo esto se hace con el mismo volcado.
Además, casi no afecta la eficiencia del programa.
Puede probar Memory Validator desde http://www.softwareverify.com/cpp/memory/index.html
Es una de las mejores herramientas con las que me he encontrado para perfilar el uso de la memoria. La versión de evaluación de 30 días está disponible para su descarga gratuita.
MTuner : un generador de perfiles de C / C ++ gratuito. Descripción a continuación:
MTuner es una herramienta de análisis, detección de fugas y detección de fugas multiplataforma que admite los compiladores MSVC, GCC y Clang. Las características incluyen: historial basado en línea de tiempo de actividad de la memoria, filtrado potente, SDK para instrumentación manual con código fuente completo, soporte de integración continua a través del uso de línea de comandos, detección de fuga de memoria y mucho más. Perfile cualquier plataforma de destino de software con compiladores cruzados GCC o Clang. Viene con soporte integrado para plataformas Windows, PlayStation 4 y PlayStation 3 y una plataforma dirigida por un compilador cruzado basado en Windows.