C # Cómo maximizar la posibilidad de que la sección de código en particular no tendrá ningún cambio de contexto?

StackOverflow https://stackoverflow.com/questions/3077501

Pregunta

Tengo pieza de tiempo crítico de código en mi aplicación. Hice el hilo que lo dirige más alta prioridad -. Eso es lo más que podía hacer

¿Hay alguna sugerencia sobre cómo hacer parte del código se ejecute en este hilo para ser interrumpido el menor número de veces posible (menos cambio de contexto se produjo)?

El código no es complicado. He sustituido todas las llamadas a métodos con código inline y yo no uso nada de alto nivel (como ningún LINQ). La mayoría de las operaciones son la aritmética. Sólo hay una comparación de cadenas (estoy pensando en maneras de cómo deshacerse de él). La mitad de las matemáticas están con enteros y medio con dobles.

El código es x86 .NET 4 C #. Se ejecuta en una sola xenón X3450 W2008R2. Un solo servidor de aplicaciones.

(Desafortunadamente datos provienen de API 3d partido que no es compatible x64 (odio!))

apreciaría discusión adulta con los desarrolladores experimentados.

P.S. El servidor no tiene ningún archivo de paginación para errores de página planteo ocurren ya sea (no hay operaciones de IO no deseados).

¿Fue útil?

Solución

Lo único que tiene que preocuparse acerca en términos de cambios de contexto, está bloqueando su hilo. Así que no debería haber ningún problema con el uso de LINQ (es decir, LINQ a objetos, obviamente LINQ a SQL o lo que implicaría el bloqueo!). Cualquier tipo de métodos aritméticos o llamadas y así sucesivamente también no bloqueará el hilo y por lo tanto no tienen ningún impacto en los cambios de contexto.

La otra cosa que afecta el cambio de contexto es, como se anotó, la prioridad. Pero no solo subproceso de prioridad, también la prioridad de su proceso. Puede usar SetPriorityClass al aumento la prioridad de su proceso para ABOVE_NORMAL_PRIORITY_CLASS (no me molestaría ponerlo más alto que eso) y luego establecer la prioridad de su hilo superiores a lo normal también.

Sin embargo, en general, las prioridades son realmente sólo es útil cuando se trata de una cuestión de Tiempo (es decir, asegurándose de que sus responde proceso a la entrada externa (red, la entrada del usuario, disco I / O) como más rápido posible). En realidad, tendrá muy poco impacto en el rendimiento real de su hilo, a menos que tenga otros procesos que también están limitados por CPU funcionando al mismo tiempo. Pero si ese es el caso, entonces jugando con las prioridades no va a ser una solución viable a largo plazo de todos modos. Esto se debe a que usted encontrará que mediante el establecimiento de uno de los procesos de mayor prioridad, se morirá de hambre por completo los otros procesos y que nunca va a correr.

Así que de todos modos, me gustaría considerar cuidadosamente las cosas antes de ajustar las prioridades de subprocesos y procesos. Y, como siempre, prueba, prueba, prueba!

Otros consejos

Si usted hace que el código no administrado WINAPI lugar, la función SetThreadPriority también soporta una THREAD_PRIORITY_TIME_CRITICAL (mayor que THREAD_PRIORITY_HIGHEST).

También vale la pena impulsar la prioridad del proceso en el que el hilo se está ejecutando (prioridad real depende de una combinación de hilo y la prioridad del proceso).

También debe evitar hacer llamadas de E / S en la rosca (que podría bloquear). Llevándolo a un extremo tal vez ridícula también se puede evitar hacer llamadas de E / S en otros hilos (que podrían aumentar temporalmente la prioridad de esos hilos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top