Usar ThreadStatic para reemplazar locales caros: ¿buena idea?

Actualizar: como debería haber esperado, el sólido consejo de la comunidad en respuesta a esta pregunta fue "medirlo y ver".chibacity publicó una respuesta con algunas pruebas realmente buenas que hicieron esto por mí; mientras tanto, escribí una prueba propia; y la diferencia de rendimiento que vi fue realmente tan grande queMe sentí obligado a escribir una publicación de blog al respecto.

Sin embargo, también debo reconocerLa explicación de Hans que elThreadStatic El atributo no es gratuito y, de hecho, se basa en un método auxiliar CLR para hacer su magia. Esto hace que sea poco obvio si sería una optimización apropiada aplicar en cualquier caso arbitrario.

La buena noticia para mí es que, enmi caso, parece haber hecho una gran mejora.

Tengo un método que (entre muchas otras cosas) instancia algunas matrices de tamaño mediano (~ 50 elementos) para algunas variables locales.

Después de algunos perfiles, he identificado este método como una especie de cuello de botella de rendimiento. No es que el método demore mucho en llamar; más bien, simplemente se llamamuchos veces, muy rápidamente (cientos de miles a millones de veces en una sesión, que serán varias horas). Por lo tanto, incluso las mejoras relativamente pequeñas en su rendimiento deberían valer la pena.

Se me ocurrió que tal vez en lugar de asignar una nueva matriz en cada llamada, podría usar campos marcados[ThreadStatic]; cada vez que se llama al método, verificará si el campo se inicializa en el hilo actual y, si no, lo inicializará. A partir de ese momento, todas las llamadas en el mismo hilo tendrán una matriz lista para funcionar en ese punto.

(El método inicializa cada elemento de la matriz en sí, por lo que tener elementos "obsoletos" en la matriz no debería ser un problema).

Mi pregunta es simplemente esta: ¿esto parece una buena idea? ¿Existen dificultades para usar elThreadStatic Atributo de esta manera (es decir, como una optimización del rendimiento para mitigar el costo de crear instancias de nuevos objetos para variables locales) que debo conocer. Es el desempeño de unThreadStatic el campo en sí tal vez no es genial por ejemplo, ¿hay muchas "cosas" adicionales en segundo plano, con su propio conjunto de costos, para hacer posible esta función?

También es bastante plausible para mí que me equivoque al tratar de optimizar algo tan barato (?) Como una matriz de 50 elementos, y si es así, definitivamente hágamelo saber, pero elgeneral la pregunta aún se mantiene.

Respuestas a la pregunta(3)

Su respuesta a la pregunta