2008-12-15 22 views
21

Tengo algunos problemas de rendimiento con mi aplicación Delphi 2006. ¿Puede sugerir herramientas de perfilado que le ayudarán a encontrar el cuello de la botellaDelphi Profiling tools

es decir Una herramienta como Profiler turbo

+0

http://www.prodelphi.de/ – Ampere

+0

Esto es gratuito y fácil de usar (en comparación con ProDelphi). delphitools.info/downloads/samplingprofiler-changelog – Ampere

Respuesta

24

me hizo la misma question no hace mucho tiempo

He descargado e intentaron AQtime. Parece completo, pero no es una herramienta fácil de usar y es MUY caro para un programador individual (es decir, $ 600 US). 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: Why is CharInSet faster than Case statement?

Probé una demo 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 tu código para agregar la instrumentación, que debe 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 pueda usarlo con Delphi 2006.

ProDelphi y GpProfile solo tendrán un 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 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 posterior answer le dio a Eric Grange un perfilador de muestreo gratuito 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, puede que sea mejor si ahorra sus $ 600 al NO comprar AQtime, y en cambio usar eso para actualizar su Delphi 2006 a Delphi 2009. La estabilidad, la velocidad y las características adicionales (especialmente Unicode), valdrán la pena tu tiempo Ver: What are major incentives to upgrade to D2009 (Unicode excluded)?

También AQtime aún no se integra en Delphi 2009.

Otro otro gratis, con una fuente que me enteré, pero aún no lo he intentado es TProfiler. Si alguien ha intentado eso, me gustaría saber qué piensan.


Nota: El Addenum añadí después para question 291631 parece que puede ser la respuesta. Ver Andre's open source program: asmprofiler


feb 2010 seguimiento. 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.

+0

Estoy bastante seguro de que AQTime 6 se integrará con Delphi 2009. – lukeck

+0

A partir del 15 de diciembre de 2008, no es así. Cuando no pude obtener la descarga de prueba para integrarme, me comuniqué con AutomatedQA, y me dijeron que todavía están trabajando en esto. AQTime 6.10 solo funcionará con Delphi 2009 como un programa separado. – lkessler

+0

AQTime 6.30 fue lanzado en noviembre de 2009 y finalmente ha agregado integración a Delphi 2009. Pero, por supuesto, Delphi 2010 ya está disponible, y no, AQTime aún no tiene integración con eso. Quizás otro año espere a la gente de D2010. – lkessler

3

www.AutomatedQA.com tiene la mejor opción para Delphi perfilado (AQTime)

+2

Tenga en cuenta que AQA se basa en la instrumentación y no en el perfilado, y por lo tanto dará resultados engañosos para cuellos de botella de grano muy fino. –

+0

s/not profiling/not sampling/ –

-1

nota final, www.torry.net es un gre en el lugar para la búsqueda de componente/herramienta Delphi

+7

Darian, en lugar de agregar 4 respuestas a una pregunta, edite su primera respuesta para proporcionar toda la información y elimine las otras 3. –

5

He usado http://www.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.

3

Utilizo y recomiendo Sampling Profiler, creo que puede obtenerlo de embarcadeiro.public, archivos adjuntos del grupo de noticias.

+0

Ahora está en http://delphitools.info/ –

11

acabo de encontrar una muy buena conexión sampling profiler y es compatible con Delphi 2009

+0

También funciona con Delphi 7, gracias por este. Tenga en cuenta que asegúrese de habilitar la información de depuración TD32 en las opciones del enlazador. –

8

He usado ProDelphi, sobre todo para determinar qué rutinas están comiendo la mayor parte del 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 le agarras el truco. 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 que funciona a tiempo 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 & lo apunta al código fuente.


Estaba atrapado tratando de optimizar un bucle interno que llamaba a 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 me dijo VTune:

  • línea nnnn [línea de 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, porque 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 suficiente. 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.