Herramientas de perfilado de Delphi
performance profiling (9)
Estoy teniendo algunos problemas de rendimiento con mi aplicación Delphi 2006. ¿Puede sugerir herramientas de perfilado que me ayuden a encontrar el cuello de la botella
es decir, una herramienta como Turbo Profiler
Acabo de encontrar un perfilador de muestreo gratuito muy bueno y es compatible con Delphi 2009
Aquí hay otra opción, no he usado este antes: prodelphi.de
He usado prodelphi.de con éxito en el proyecto Delphi 7 en el pasado. Barato y funciona. No dejes que el sitio web de bush league te asuste.
He usado ProDelphi, principalmente para determinar qué rutinas están comiendo más tiempo. Es un Instrumenting Profiler, lo que significa que agrega un poco de código al principio y al final de cada rutina. Usted controla las rutinas que perfila por directivas dentro de los comentarios. También puede perfilar secciones de una rutina. Pero las secciones deben comenzar y detenerse en el mismo nivel de bloque, sin entrada ni salida de la sección. La optimización debe estar desactivada cuando ProDelphi inserta su código (donde coloca las directivas), pero puede activarlo en cualquier otro lugar.
La interfaz es un poco klunky, pero muy rápido una vez que te acostumbras. Puede hacer un trabajo útil con la versión gratuita (limitada a 10 rutinas o secciones). ProDelphi puede decirle rápidamente qué rutinas debe examinar. Pero no por qué, o qué líneas.
Recientemente, comencé a usar el analizador de rendimiento VTune de Intel. ''WOW'' no comienza a resumir. Estoy impresionado Simplemente no tenía idea de que todo esto estaba integrado en los procesadores Intel modernos. ¿Sabía que puede decirle exactamente con qué frecuencia una sola instrucción debe esperar a que la Caché de Datos L1 mire hacia los lados de otro núcleo antes de volver a cargar una palabra de un caché superior? Si sigo escribiendo, voy a sonar como un anuncio sin aliento para el producto.
Vaya a Intel y descargue la demostración cronometrada de trabajo completo. Busca en la red y encuentra un par de videos sobre cómo comenzar. (De lo contrario, corre el riesgo de quedar bloqueado por todas las opciones). Funciona con cualquier compilador. Simplemente apúntalo a un .exe. Le mostrará las líneas de origen si su .exe incluye información de depuración y lo apunta al código fuente.
Estaba atrapado tratando de optimizar un bucle interno que llamó una función que escribí. No hubo llamadas externas, excepto la longitud (str). Este circuito interno funcionó miles de millones de veces por ejecución y consumió aproximadamente la mitad del tiempo de la CPU, un candidato perfecto para la optimización. Probé todo tipo de optimizaciones estándar, con poco o ningún efecto. VTune muestra puntos calientes. Simplemente profundicé hasta que me mostró el ASM que mi código generó, y cuánto tiempo tomó cada instrucción.
Esto es lo que VTune me dijo:
- línea nnnn [línea del código delphi] ...
- addr hhhh cmp byte ptr [edx + ecx], 0x14h - - - - - - - - 3 ciclos
- addr hhhh ja label_x - - - - - - - - - - - - - - - - - - -10302 ciclos
Los valores absolutos no significan nada. (Creo que estaba midiendo ciclos por instrucción retirada). Los valores relativos dejan un poco claro hacia dónde se fue todo el tiempo. Lo mejor fue la ventana de consejos. Me dijo que el código se había detenido a la espera de que los datos se cargaran en el caché de datos L1, y en realidad me dio buenos consejos sobre cómo evitar los puestos.
Mi error fue pensar en el Core2 Quad como una CPU 8086 realmente rápida. No ^ 3. El código estaba gastando el 99% de su tiempo esperando a que los datos se cargaran de memoria porque estaba saltando demasiado. Mi algoritmo suponía que la memoria era RAM (acceso aleatorio). Así no es como funcionan las CPU modernas. Se puede acceder a los datos en la memoria caché L1 en 1 o 2 ciclos, pero acceder a la memoria caché L2 o L3 cuesta de decenas a cientos de ciclos, y ir a RAM cuesta miles. Sin embargo , toda esa latencia se evita cuando accede a sus datos secuencialmente, ya que el procesador precargará la caché con los datos que siguen al primer byte que solicite.
El resultado neto es que reescribí el algoritmo para acceder a los datos más secuencialmente, y obtuve una aceleración de 10x, que fue lo suficientemente bueno. Cuando tenga tiempo, estoy seguro de que puedo obtener otros 10x. Pero eso es solo el Geek en mí. Lo suficientemente bueno es lo suficientemente bueno.
Ya sabía que usted obtiene el máximo rendimiento optimizando su algoritmo, no su código. Pensé que solo necesitaba el generador de perfiles para decirme qué necesitaba una optimización. Pero también necesitaba encontrar el motivo del cuello de botella para poder diseñar un algoritmo más rápido.
El nuevo algoritmo no es radicalmente diferente del anterior. Simplemente almacena los datos de manera que se puede acceder de forma secuencial. Por ejemplo, en un lugar moví un campo de una matriz de registros a su propia matriz de enteros, porque el ciclo interno no necesitaba el resto de los datos en cada registro. También tenía una matriz rectangular almacenada como una matriz dinámica de matrices dinámicas. El código usó esto para acceder aleatoriamente a megabytes de datos (y el pobre caché de datos L1 es solo de 64 Kb). Descubrí cómo almacenarlo en una matriz lineal como diagonales de la matriz, que es el orden en que uso los datos. (OK, tal vez esa parte es radical.)
De todos modos, estoy vendido en VTune.
Hice la misma question no hace mucho tiempo
He descargado y probado AQtime. Parece integral, pero no es una herramienta fácil de usar y es MUY cara para un programador individual (es decir, $ 600 USD). Me encantó el hecho de que no era invasivo (no cambió su código), y que podría hacer un perfil línea por línea, hasta que encontré que, dado que es un generador de perfiles instrumental, puede conducir a optimizaciones incorrectas como en: ¿Por qué es CharInSet más rápido que la declaración de caso?
Intenté una demostración de ProDelphi, mucho menos costosa (alrededor de $ 80, creo), pero fue demasiado torpe para mí, no me gustó la interfaz de usuario, y es invasiva, cambiando el código para agregar la instrumentación, que tienes que tener cuidado.
Utilicé GpProfile con Delphi 4 durante muchos años. Me encantó. También fue invasivo, pero funcionó tan bien que aprendí a confiar en él y nunca me dio problemas en 10 años. Pero cuando me actualicé a Delphi 2009, no creí que fuera mejor intentar usarlo, ya que no se ha actualizado y, según admite GP, no funcionará sin modificaciones. Espero que no puedas usarlo tampoco con Delphi 2006.
ProDelphi y GpProfile solo perfil en el nivel de procedimiento. Si desea hacer líneas individuales (que a veces tuve que hacer), debe llamar a PROC1, PROC2, PROC3 para cada línea y poner una línea en cada PROC. Fue un poco molesto tener que hacer eso, pero me dio buenos resultados (al menos estaba contento con los resultados de que GpProfile lo haya hecho).
La respuesta que acepté en mi pregunta de CharInSet decía que "los perfiladores de muestreo, que periódicamente verifican la ubicación de la CPU, suelen ser mejores para medir el tiempo de código". y una answer posterior proporcionó el perfilador de muestreo gratuito de Eric Grange para Delphi que ahora admite Delphi 2009. No lo he probado aún, pero he escuchado cosas buenas sobre él, y es el próximo que voy a probar.
Por cierto, es mejor que ahorres tus $ 600 al NO comprar AQtime y, en su lugar, usar eso para actualizar tu Delphi 2006 a Delphi 2009. La estabilidad, la velocidad y las características adicionales (especialmente Unicode), valdrán la pena. Ver: ¿Cuáles son los principales incentivos para actualizar a D2009 (Unicode excluido)?
Además, AQtime aún no se integra en Delphi 2009.
Otro gratis, con una fuente que descubrí, pero que aún no he probado, es TProfiler . Si alguien ha intentado eso, me gustaría saber qué piensan.
Nota: El Addenum que agregué luego a la question parece ser la respuesta. Vea el programa de código abierto de Andre: asfrofiler
Seguimiento de febrero de 2010. Mordí la bala y compré AQTime. Hace unos meses finalmente lo integraron en Delphi 2009, que es lo que uso (pero todavía tienen que hacer Delphi 2010). La visualización de las líneas fuente y sus tiempos y conteos individuales es invaluable para mí, y AQ Time hace un excelente trabajo al respecto.
La elección final que conozco para Delphi, http://gp.17slon.com/gpprofile/index.htm
Nota final, www.torry.net es un excelente lugar para la búsqueda de componentes / herramientas de Delphi
Yo uso y recomiendo Sampling Profiler, creo que puedes obtenerlo de embarcadeiro.public, attachments newsgroup.
www.AutomatedQA.com tiene la mejor opción para perfiles Delphi (AQTime)