Estoy escribiendo una aplicación suave en tiempo real en C #. Ciertas tareas, como responder a las solicitudes de hardware provenientes de una red, deben completarse en una cierta cantidad de milisegundos; sin embargo, no es 100% crítico hacerlo (es decir, podemos tolerar que llegue a tiempo la mayor parte del tiempo, y el 1% es indeseable pero no un fracaso), de ahí la parte "blanda".
Ahora me doy cuenta de que C # es un lenguaje administrado, y los lenguajes administrados no son particularmente adecuados para aplicaciones en tiempo real. Sin embargo, la velocidad con la que podemos hacer las cosas en C #, así como las características del lenguaje, como la reflexión y la administración de memoria, hacen que la tarea de construir esta aplicación sea mucho más fácil.
¿Hay optimizaciones o estrategias de diseño que uno pueda tomar para reducir la cantidad de gastos generales y aumentar el determinismo? Idealmente tendría los siguientes objetivos
- Retrasar la recolección de basura hasta que sea "seguro"
- Permita que el recolector de basura funcione sin interferir con los procesos en tiempo real
- Hilo / prioridades de proceso para diferentes tareas
¿Hay alguna forma de hacer esto en C #, y hay otras cosas a tener en cuenta con respecto al tiempo real cuando se usa C #?
El objetivo de la plataforma para la aplicación es .NET 4.0 Client Profile en Windows 7 de 64 bits, con. Lo configuré actualmente en Perfil del cliente, pero esta era solo la opción predeterminada y no se eligió por ningún motivo en particular.
fuente
Respuestas:
La optimización que cumple sus dos primeras viñetas se llama un conjunto de objetos . Funciona por
Puede encontrar una clase de ejemplo que implemente un grupo de objetos usando un
ConcurrentBag
aquí .La prioridad de subprocesos / procesos se puede establecer fácilmente en tiempo de ejecución. La clase Thread tiene métodos y propiedades que le permiten establecer la prioridad y la afinidad del procesador. La clase de proceso contiene instalaciones similares.
fuente
Puede hacerlo estableciendo el modo de latencia GC en
LowLatency
. Para obtener más información, vea esta respuesta en SO .fuente
Tome el mismo enfoque que el desarrollo de juegos en un entorno administrado e intente minimizar la creación / muerte de objetos al mínimo absoluto.
Por ejemplo, intente crear todos los objetos que puedan ser necesarios al inicio y agrupar obsesivamente, pase por referencia siempre que sea posible, evite las operaciones que crean objetos intermedios a corto plazo
fuente
Tenga en cuenta que el entorno de destino (Windows) es un O / S multitarea preventivo. En otras palabras, su proceso suave en tiempo real inevitablemente se adelantará en algún momento u otro, lo que introducirá otras latencias además de la recolección de basura .NET. Puede mitigarlo reduciendo el valor del intervalo de tiempo (cuántico) (el valor predeterminado es algo así como 16 ms) y elevando la prioridad de su proceso (pero hay límites prácticos), pero las anticipaciones tendrán / deben ocurrir porque otros procesos esenciales aún necesitan para hacer cosas Todo esto no tiene nada que ver con el lenguaje de programación; Es fundamental para el O / S.
Dejando a un lado los problemas de GC, su aplicación que se ejecuta en una máquina Windows lista para usar probablemente pueda entregar latencias de unos pocos milisegundos LA MAYOR PARTE DEL TIEMPO. Ciertamente no se puede garantizar el 100% del tiempo, ni nada parecido. Incluso con el ajuste (cuántica corta, alta prioridad), aún obtendrá latencias altas ocasionales. Es la naturaleza de la bestia.
En pocas palabras: si necesita tiempos de respuesta garantizados, especialmente en el orden de unos pocos milisegundos, Windows probablemente no sea la mejor opción para la entrega O / S.
fuente