Estoy escribiendo una aplicación DSP en C# (básicamente, un editor multipista). Lo he estado perfilando durante bastante tiempo en diferentes máquinas y he notado algunas cosas "curiosas".Forzar el compilador .NET JIT para generar el código más optimizado durante la puesta en marcha de la aplicación
En mi máquina doméstica, la primera ejecución del ciclo de reproducción ocupa aproximadamente del 50% al 60% del tiempo disponible (supongo que es debido a que el JIT está haciendo su trabajo), y luego para los bucles subsiguientes baja a un consumo estable del 5%. El problema es que, si ejecuto la aplicación en una computadora más lenta, la primera ejecución ocupa más que el tiempo disponible, lo que ocasiona que la reproducción se interrumpa y estropee el audio de salida, lo cual es inaceptable. Después de eso, se reduce a un consumo del 8% -10%.
Incluso después de la primera ejecución, la aplicación sigue llamando rutinas que requieren mucho tiempo de vez en cuando (cada 2 segundos más o menos), lo que hace que el consumo estable del 5% experimente picos muy cortos de 20% -25% . Me he dado cuenta de que si dejo que la aplicación se ejecute durante un tiempo, estos picos también bajarán a un 7% -10%. (No estoy seguro si es debido a que el JIT recompila estas porciones de código).
Tengo un problema serio con el JIT. Si bien la aplicación se comportará bien incluso en máquinas muy lentas, estas 'tormentas compiladoras' van a ser un gran problema. Estoy intentando descubrir cómo resolver este problema y se me ocurrió una idea, que es marcar todas las rutinas "sensatas" con un atributo que le dirá a la aplicación que las 'apriete' de antemano durante la puesta en marcha , por lo que estarán completamente optimizados cuando realmente se necesiten. Pero esto es solo una idea (y tampoco me gusta demasiado) y me pregunto si hay una mejor solución para todo el problema.
Me gustaría escuchar lo que piensan.
(NGEN la aplicación no es una opción, me gusta y quiero todas las optimizaciones JIT yo puede conseguir.)
EDIT:
consumo de memoria y recolección de basura patadas no son un problema, estoy utilizando grupos de objetos y el pico máximo de memoria durante la reproducción es de 304 Kb.
Ayudaría si dijera ** por qué ** NGEN no es una opción; entender el problema es la mitad del trabajo ... –
¿Qué optimizaciones de JIT no están disponibles cuando NGen-ing? – Will
@Marc: NGen la aplicación como último recurso, pero prefiero no usarla si hay una mejor solución disponible. – Trap