2009-07-02 33 views
6

Escribo un complemento para otro programa en C# .NET, y tengo problemas de rendimiento en los que los comandos tardan mucho más de lo normal. El complemento reacciona a los eventos en el programa host y también depende de los métodos de utilidad del SDK del programa host. Mi complemento tiene muchas funciones recursivas porque estoy leyendo y escribiendo mucho en una estructura de árbol. Además, tengo muchas suscripciones de eventos entre mi complemento y la aplicación host, así como también suscripciones de eventos entre clases en mi complemento.¿Cuál es la mejor manera de solucionar problemas de rendimiento?

¿Cómo puedo saber qué tarda tanto en completarse una tarea? No puedo usar la depuración regular del estilo de punto de interrupción, porque no es que no funcione, es solo que es demasiado lento. He configurado una clase estática de "LogWriter" a la que puedo hacer referencia de todas mis clases que me permitirá escribir líneas con marcas de tiempo en un archivo de registro de mi código. ¿Hay otra manera? ¿Visual Studio tiene algún tipo de registro con sello de tiempo que podría usar en su lugar? ¿Hay alguna manera de ver la pila de llamadas después de que la aplicación se haya cerrado?

Respuesta

15

Es necesario utilizar perfilador. Aquí enlace a uno bueno: ANTS Performance Profiler.

Actualización: También puede escribir mensajes en puntos de control usando Debug.Write. Luego debe cargar la aplicación DebugView que muestra toda su cadena de depuración con una marca de tiempo precisa. Es freeware y muy bueno para depurar y perfilar rápidamente.

+0

Red Gate es un buen software. Su perfilador de rendimiento ANTS es uno de los mejores en mi opinión. Creo que puedes descargar una versión de prueba. La mayoría de las personas que compran la versión real después, así que ten cuidado :). – bastijn

+1

El perfilador de Microsoft Well también es bueno, pero está incluido solo en los costosos paquetes de VS. – arbiter

+0

Pulgares arriba para HORMIGAS de mí también, resolvió una gran pérdida de memoria para mí –

1

A pesar del título de este tema, debo argumentar que la "mejor" manera es subjetiva, solo podemos sugerir posibles soluciones.

He tenido experiencia usando Redgate ANTS Performance Profiler que le mostrará dónde están los cuellos de botella en su aplicación. Definitivamente vale la pena echarle un vistazo.

4

My Profiler List incluye ANTS, dotTrace y AQtime.


Sin embargo, mirando más de cerca a su pregunta, me parece que se debe hacer una prueba de la unidad, al mismo tiempo que está haciendo perfiles. Tal vez comience haciendo un análisis de rendimiento general rápido, solo para ver qué áreas requieren más atención. Luego comience a escribir algunas pruebas unitarias para esas áreas. Luego puede ejecutar el generador de perfiles mientras ejecuta esas pruebas unitarias, para que obtenga resultados consistentes.

1

Visual Studio Team System tiene un perfilador incorporado, está lejos de ser perfecto, pero para aplicaciones simples puede hacer que funcione.

Recientemente he tenido el mayor éxito con EQATECs perfilador libre, o rodar mi propia clase pequeña de creación de perfiles donde sea necesario.

Además, ha habido un buen número de preguntas sobre perfiladores en ese pasado, véase: http://www.google.com.au/search?hl=en&q=site:stackoverflow.com+.net+profiler&btnG=Google+Search&meta=&aq=f&oq=

+0

+1 para señalar al generador de perfiles que es nuevo para mí. – arbiter

0

También puede utilizar contadores de rendimiento para las aplicaciones ASP.NET.

2

En mi experiencia, el mejor método es también el más simple. Hazlo funcionar, y mientras está siendo lento, presiona el botón "pausa" en el IDE. Luego haga un registro de la pila de llamadas. Repita esto varias veces. (Here's a more detailed example and explanation.)

Lo que está buscando es cualquier declaración que aparezca en más de una muestra de pila que no sea estrictamente necesaria. Cuantas más muestras aparezca, más tiempo tomará. La forma de saber si la declaración es necesaria es buscar la pila, porque eso te dice por qué se está haciendo.

Cualquier cosa que cause una cantidad significativa de tiempo para ser consumida será revelada por este método, y la recursión no le molesta.

La gente parece hacer frente a problemas como éste en una de dos maneras:

  1. Intentar obtener buenas mediciones antes de hacer nada.

  2. Simplemente encuentre algo grande que pueda deshacerse, destrúyalo y repita.

prefiero este último, porque es rápido, y porque usted no tiene que saber exactamente lo grande que un tumor es para saber que es lo suficientemente grande como para eliminar. Lo que necesita saber es exactamente dónde está, y eso es lo que le dice este método.

Cuestiones relacionadas