visual studio dottrace c# .net optimization profiling

c# - studio - ¿Cuáles son algunos recursos que puedo usar para aprender a perfilar/optimizar?



dottrace (11)

Hay dos pasos para optimizar el código.

Primero, necesitas saber qué es lento. Eso es perfilar, y, como es de suponer, un perfilador se utiliza comúnmente para esto. La mayoría de los perfiladores generalmente son fáciles de usar. Ejecuta su aplicación a través de un generador de perfiles, y cuando finaliza, el generador de perfiles le mostrará cuánto tiempo pasó en cada función, exclusiva (esta función sin contar el tiempo dedicado a la función invocada desde allí) e inclusive (tiempo empleado en este función, incluidas las llamadas a función infantil).

En otras palabras, obtienes un gran árbol de llamadas, y solo tienes que buscar los números grandes. Por lo general, tiene muy pocas funciones que consuman más del 10% del tiempo de ejecución. Así que ubique estos y sepa qué optimizar.

Tenga en cuenta que un generador de perfiles no es necesario ni, necesariamente, el mejor enfoque. Un enfoque notablemente simple, pero efectivo, es simplemente ejecutar el programa en un depurador y, en unos pocos tiempos casi aleatorios, detener la ejecución y observar la pila de llamadas. Haga esto solo un par de veces, y tiene una muy buena idea de dónde se está gastando su tiempo de ejecución. @Mike Dunlavey que comentó en esta respuesta ha descrito este enfoque en profundidad en otros lugares.

Pero ahora que sabe dónde se está gastando el tiempo de ejecución, viene la parte difícil, cómo optimizar el código.

Por supuesto, el enfoque más efectivo suele ser el de alto nivel. ¿El problema tiene que ser resuelto de esta manera? ¿Tiene que ser resuelto en absoluto? ¿Pudo haber sido resuelto de antemano y el resultado almacenado en caché para que pudiera entregarse instantáneamente cuando el resto de la aplicación lo necesitara? ¿Hay algoritmos más eficientes para resolver el problema?

Si puede aplicar tales optimizaciones de alto nivel, haga eso, vea si eso mejoró el rendimiento lo suficiente, y si no, vuelva a perfilar.

Tarde o temprano, es posible que deba sumergirse en más optimizaciones de bajo nivel. Sin embargo, este es un territorio complicado. Las computadoras de hoy en día son bastante complejas y el rendimiento que obtiene de ellas no es directo. El costo de una rama o una llamada a una función puede variar ampliamente según el contexto. Agregar dos números juntos puede llevar de 0 a 100 ciclos de reloj dependiendo de si ambos valores ya estaban en los registros de la CPU, qué más se está ejecutando en ese momento, y un número de otros factores. Entonces la optimización en este nivel requiere (1) una buena comprensión de cómo funciona la CPU, y (2) mucha experimentación y mediciones. Puede realizar fácilmente un cambio que crea que será más rápido, pero debe estar seguro, así que mida el rendimiento antes y después del cambio.

Existen algunas reglas generales que a menudo pueden ayudar a guiar las optimizaciones:

E / S es costoso. Las instrucciones de la CPU se miden en fracciones de un nanosegundo. El acceso a la RAM es del orden de decenas a cientos de nanosegundos. Un acceso al disco duro puede tomar decenas de milisegundos . Muy a menudo, la E / S será lo que está ralentizando su aplicación. ¿Su aplicación realiza pocas lecturas de E / S grandes (lea un archivo de 20 MB en una gran porción) o innumerables pequeñas (lea los bytes 2,052 a 2073 de un archivo, luego lea un par de bytes de otro archivo)? Menos lecturas grandes pueden acelerar su E / S en un factor de varios miles.

Los fallos de página también implican accesos al disco duro. Las páginas en memoria se deben insertar en el archivo de paginación, y las paginadas se deben volver a leer en la memoria. Si esto sucede mucho, va a ser lento. ¿Puedes mejorar la localidad de tus datos para que se necesiten menos páginas al mismo tiempo? ¿Puede simplemente comprar más RAM para la computadora host para evitar tener que sacar datos de la página? (Como regla general, el hardware es barato. Actualizar la computadora es una optimización perfectamente válida, pero asegúrese de que la actualización haga la diferencia. Las lecturas de discos no serán mucho más rápidas si se compra una computadora más rápida. Y si todo encaja en la RAM en su sistema anterior, no tiene sentido comprar uno con 8 veces más RAM)

Su base de datos también se basa en accesos al disco duro. Entonces, ¿puede salirse con la tarea de almacenar en caché más datos en la memoria RAM y solo ocasionalmente escribirlos en la base de datos? (Por supuesto que hay un riesgo allí. ¿Qué sucede si la aplicación se bloquea?

Y luego está todo el mundo favorito, enhebrado. Una CPU moderna tiene entre 2 y 16 núcleos de CPU disponibles. ¿Los estás usando todos? ¿Te beneficiarías de usarlos? ¿Hay operaciones de larga ejecución que se pueden ejecutar de forma asincrónica? La aplicación inicia la operación en una secuencia separada, y luego puede reanudar la operación normal al instante, en lugar de bloquear hasta que la operación se complete.

Entonces, básicamente, use el perfilador para comprender su aplicación. ¿Cómo gasta su tiempo de ejecución, dónde se gasta? ¿El consumo de memoria es un problema? ¿Cuáles son los patrones de E / S (tanto en el disco duro y acceso a la red, como en cualquier otro tipo de E / S)? ¿La CPU está funcionando todo el tiempo o está inactiva esperando eventos externos, como E / S o temporizadores?

Y luego comprenda todo lo posible sobre la computadora en la que se está ejecutando. Comprenda qué recursos tiene disponible (caché de CPU, núcleos múltiples) y qué significa cada uno de ellos para el rendimiento.

Todo esto es bastante vago, porque los trucos para optimizar un gran servidor de base de datos van a ser muy diferentes de lo que haría para optimizar un gran algoritmo de cálculo de números.

Acabo de heredar un proyecto de C # que se ralentiza y tendrá que comenzar a optimizarlo. Lo que quería hacer primero es aprender un poco más acerca de la creación de perfiles / optimización ya que no tenía que hacerlo antes. Entonces, la pregunta es ¿dónde empiezo, qué libros / blogs / articulos puedo leer?

Sé de los perfiles de .net como Profiler de ANTS y ​​demás, pero no tengo idea de cómo usarlos de manera eficiente. Realmente no lo he usado, solo déjalo correr en algunas aplicaciones de muestra para jugar con la salida.



Si está familiarizado y ya ha comprado ANTS (un perfilador muy fino), vaya aquí para obtener un tutorial rápido para que pueda comenzar a utilizarlo.


Si tiene Visual Studio Team System, sugiero usar el Profiler que contiene.
Está en "Analizar-> Perfilador"
Usar este generador de perfiles es realmente simple. Puedes simplemente sumergirte y ver lo que haces de él. La práctica práctica es mejor que cualquier artículo o libro que vayas a leer al respecto.

Encontrar sus primeros cuellos de botella es fácil con solo unos pocos clics. Resolverlos podría ser un poco más complicado, pero de nuevo, Optimizar el código es solo una cuestión o práctica y experiencia.


Esto no te ayudará mucho en C #, pero las herramientas OS X Shark (vienen con las herramientas de desarrollador de Apple) son las mejores herramientas de creación de perfiles que he encontrado. ¡Casi divertido de usar!

En cuanto a los perfiles, hay dos formas de acercamiento. Primero, debes entender el software. Las estructuras de datos especialmente. No comience a optimizar a menos que lo entienda primero.

Segundo, debes medir (lo que parece que estás a punto de hacer). He sido engañado por mi instinto visceral casi siempre; lugares que consideraría secundarios son los que toman el tiempo. Esto también significa que cuando estás optimizando siempre estás optimizando para un cierto conjunto de casos de prueba que ejecutas. La selección de tales casos es importante.


Hay herramientas de análisis de rendimiento y análisis de perfil, pero mientras intentas encontrar / comprar / instalar / aprender uno, solo prueba el truco de un veterano ...

Ejecuta la aplicación bajo el IDE, y mientras está siendo lento, presiona el botón "Pausa" y pregúntale qué está haciendo y por qué . La mejor manera de responder esto es leyendo la pila de llamadas.

Si es varias veces más lento de lo que debería ser, como 10 veces, eso significa que está gastando el 90% de su tiempo haciendo algo innecesario, y esa es la probabilidad de que lo atrape haciéndolo . Si repite esto varias veces, puede confirmar sus sospechas con la precisión que desee.

Entonces no necesitas una lupa cara / popular pero difusa.

Por lo tanto, encontrar la razón de la lentitud no es la parte difícil, y generalmente hay varios.

La parte difícil es que, después de haber arreglado algunas "frutas bajas", probablemente tendrá que enfrentar el hecho de que la razón principal de la lentitud es el exceso de diseño.

Buena suerte.


Lea el blog de Rico Mariani . Antes de ser promovido, era un tipo de tuning de rendimiento para .Net. Las entradas más antiguas en su blog tienen muchísimos buenos consejos. Comenzaría cerca del principio y seguiría adelante.

Eso, más los artículos que ya has encontrado (especialmente el primero ) deberían ayudarte a comenzar.


He usado perfiladores antes, pueden ser útiles, pero puede obtener mucha ayuda simplemente al crear una clase de tipo cronógrafo único y hacer clic en "Hacer clic" (hacer que imprima la hora desde el último clic y lo que se acaba de hacer) tomó ese tiempo) antes y después de los métodos que crees que podrían ser problemáticos.

Si la velocidad es un problema en toda la aplicación, es probable que no puedas hacer demasiado al respecto, pero es posible que puedas hacer algunos cambios ...

Busque los bucles internos. Estas son muertes de rendimiento. Un bucle interno puede ser causado por algo tan simple como indexar en una lista enlazada, o hacer una ordenación por inserción en una lista basada en arreglos. (Una vez que tenía un cuadro de lista que tardaba entre 10 y 20 minutos en llenarse con decenas de miles de entradas, aunque eran demasiadas entradas, la peor parte era que estaba clasificándola al insertar cada entrada en una lista de matriz).

Busque casos en los que realice operaciones largas basadas en presionar teclas. Esto casi siempre debe hacerse fuera del hilo principal.

Ni siquiera PIENSE en optimizar cosas como números de clases o con qué frecuencia se crean instancias, concatenación de cadenas (fuera de bucles), anulación de variables o cualquiera de las otras estrategias tontas que parecen que deberían ayudar. Intenté algunas y siempre terminé sintiéndome tonto cuando en realidad disminuía la velocidad porque no era tan inteligente como el tiempo de ejecución en la mayoría de las cosas.


Descargo algunas de las herramientas de creación de perfiles disponibles (pruebas gratuitas) y empiezo a usarlas.

Usé jetbrains , y hay otros. ( hormigas, por ejemplo , devpartner y MS one?, atomatedqa , etc.) No debería tener demasiados problemas para ejecutarlos. Tienen informes que le brindan mucha información y puede aprender bastante rápido simplemente usando las aplicaciones.

Cualquiera de ellos probablemente te ayude y es bueno usar las pruebas. A continuación, puede dejar de lado la decisión de comprar la herramienta o comprar la que le resultó más útil / más fácil de usar. En general, ahorran mucho tiempo y vale la pena el dinero, aunque algunos pueden ser costosos. (Tengo dificultades con los que están en el extremo superior cuando hay herramientas muy buenas por mucho menos dinero)

Es posible que encuentre algunos problemas graves de rendimiento el primer día que los instale y los ejecute. Sé que lo hice.

buena suerte.

solo descarga algunas herramientas y comienza a ejecutar tu aplicación.

EDITAR:

En cuanto a libros y aprendizaje, básicamente, la mejor manera de aprender sobre problemas con el código es encontrar un código incorrecto. Muchas veces haciendo inspecciones con desarrolladores experimentados será útil.

como ejemplo: creo que Joel escribió un artículo sobre cómo hizo algo así como

for (int i = 0; i <strlen (alguna cadena); i ++)

eso es bastante obvio que vas a llamar a strlen (caro) en cada iteración del ciclo.

Tendrás que mirar algo del código después de que el generador de perfiles te diga dónde se está gastando el tiempo y ver si el código se puede arreglar fácilmente con cosas simples como esa, o se tienen que hacer cambios en el diseño de los algoritmos.


Ya has golpeado el clavo en la cabeza con el Perfilador. Todos ellos, al menos todo lo que he usado, siguen la misma metodología básica. Selecciona el ejecutable y luego ejecuta la aplicación.

Lo que hace con el resultado es encontrar los métodos que requieren más tiempo.l Esto no es todo, pero solicitó una buena forma de aprender a optimizar el código, por lo que las rutinas de larga ejecución son un buen lugar para comenzar. ANTS, que usted mencionó, mostrará de manera predeterminada las rutinas de larga ejecución, como la mayoría, si no todas, otras.

Puede excluir los métodos del contenedor, como Main (), a menos que tenga muchos códigos allí (poco probable).

En general, encuentro más residuos en tres áreas:

  1. Bucles
  2. Recursión
  3. Latencia de conexion

El área n. ° 3, para la base de datos, es generalmente fácil de detectar si también perfilará su base de datos, ya que verá el número de visitas. La mejor manera de reducir la latencia de la red, ya sea de base de datos o no (llamadas de servicio, por ejemplo), es comunicarse en mensajes en lugar de CRUD. No consulte cada tabla, una a la vez. Desafortunadamente, la solución a menudo requiere enlatar partes de muchas capas de datos comunes.

La recursividad y los bucles son problemas muy similares. Si quieres golpear por el dinero, primero golpea el bucle interno.

En .NET, también puede aprender mucho sobre optimización aprendiendo IL básico y examinando el IL de sus aplicaciones a través de herramientas como Reflector. Un poco de pérdida de tiempo, si esta no es la parte principal de la descripción de su trabajo, o algo que probablemente quiera dedicar a su carrera futura. Ser un bombero paga bien, pero ser un codificador de mantenimiento puede ser muy aburrido.

Solo hay un par de libros sobre optimización y creación de perfiles de aplicaciones .NET. El que tiene optimismo en el título. El libro de depuración para .NET tiene cierta información sobre Profiling, pero no es muy profundo. Sin embargo, es un gran libro para leer para la optimización, ya que muchos problemas que causan errores también aparecerán en sus viajes de optimización.