2010-05-03 8 views

Respuesta

28

También puede usar la API de recopilación de datos del perfilador para iniciar y detener el perfilado de los métodos que le interesan. Consulte this MSDN article para obtener un tutorial.

La mejor manera de utilizar la API en este caso sería llamar al StartProfile justo antes de que sus métodos se ejecuten y luego llamar al StopProfile justo después. Debería comenzar a crear perfiles a través de la opción "Comenzar con la creación de perfiles en pausa" para que no comience a perfilar hasta que llegue a la primera llamada al StartProfile.

El uso de la API de recopilación de datos funcionará con muestreo o instrumentación.

1

No lo hagas.

Está buscando "el cuello de botella", ¿no?

Probablemente no esté en la función donde cree que está.

This is the method I rely on, for any language or OS.

Si el problema está en que la función, que le dirá. Si está en otro lugar, te dirá.


@downvoter: ¿Cuál es el problema? Si le preocupa la velocidad de inicio de la aplicación, tome muestras manualmente durante el inicio de la aplicación.

La alternativa en un generador de perfiles es ejecutarlo durante todo el tiempo y luego tratar de averiguar qué parte de la línea de tiempo fue el inicio. Y dado que gran parte del tiempo lo gasta en espera del usuario, cuando no desea muestras, lo pone en modo de muestreo de CPU. El problema con esto es que no se ven cosas como el tiempo de E/S dedicado a cargar dlls, consultar DNS, etc., que puede ser dominante durante el inicio.

Luego está todo el problema de las tonterías de presentación como "hot path", donde el verdadero tomador de tiempo puede easily hide.

En caso de que preguntes "¿Cómo puedo examinar miles de muestras de pila?" la respuesta es no necesita. Si la puesta en marcha es notablemente lenta, es porque está gastando una gran parte de su tiempo haciendo algo que no tiene que hacer; una fracción como, por ejemplo, 30%, para ser conservador. Eso significa que lo verá, en promedio, una vez cada 3.33 muestras. Como necesita verlo dos o más veces para saber que es un problema, en promedio necesita 6.67 muestras. Cuanto más grande es el problema, menos muestras necesita. (Si es 90%, solo necesita 2/0.9 = 2.2 muestras) Si examina 20 muestras, verá cualquier problema que cueste más de 10%, y si lo soluciona, cualquier problema menor tomará un porcentaje mayor - se amplifican por la relación de aceleración, por lo que son más fáciles de encontrar en la próxima ronda. Here's the math.

+0

a veces solo quiere limitar el alcance a una parte específica de la aplicación ... por ej. una aplicación web tarda mucho en comenzar (solo porque tiene mucho que ver), pero quiero comprobar cómo se comporta una parte específica del proceso de inicio, las que escribí, no el código que la infraestructura de un asp la aplicación .net se ejecuta. – rekna

+0

@rekna: Bien, entonces si puedes ejecutarlo bajo un depurador, toma muestras de la pila. Si tu rutina está en la pila menos del 10% del tiempo, entonces es probable que no valga la pena acelerar: esa es tu decisión. Si está en la pila con más frecuencia que eso, las muestras le indicarán exactamente cómo pasa su tiempo (es decir, dónde está llamando qué, y qué es * que * llama, etc.) en porcentajes. Eso es lo que lo llevará directamente al código, puede acelerar, suponiendo que haya alguno. (Por lo general, lo es). –

+0

@rekna: las aplicaciones .net tienden a generar mucho jao-ha durante el inicio, cosas que nunca adivinarías, y podrían estar bajo tu código y podrían no serlo. Cargando complementos, cargando recursos, inicializando estructuras de datos, cargando controles de UI, inicializando cuadrículas, todas estas cosas son notorias para deambular en locas persecuciones de código. –

14

Sí, con un poco de esfuerzo, usted puede hacer esto de perfiles si lo hace la instrumentación (no se toman muestras):

  1. Añadir su binario/proyecto como un objetivo en explorador de rendimiento
  2. botón derecho del ratón en el destino, haga clic en Propiedades
  3. Vaya a la sección Instrumentación, desmarque "Excluir funciones pequeñas ..."
  4. Vaya a la sección Avanzado, en "Opciones de instrumentación adicionales", especifique los métodos que desea específicamente t o perfil (p. /include:ConsoleApp.Program::Main,MyNamespace.MyClass::MyFunc)

La sintaxis /include es un poco raro, pero si se lanza un símbolo del sistema VS e ir al directorio de su binario, puede ejecutar vsinstr.exe /dumpfuncs foo.exe para ver la lista de métodos que de manera explícita se pueden incluir.

Consulte el vsinstr.exe command-line syntax para obtener más información.

+0

bien, parece una alternativa interesante a la de abajo, ¡¡¡¡¡¡¡¡¡¡!! – rekna

Cuestiones relacionadas