Usando o ThreadStatic para substituir locais caros - boa ideia?

Atualizar: como eu esperava, o conselho sensato da comunidade em resposta a essa pergunta foi "medir e ver".chibacity postou uma resposta com alguns testes muito bons que fizeram isso por mim; enquanto isso, escrevi um teste por mim mesmo; e a diferença de desempenho que vi foi realmente tão grande queEu me senti compelido a escrever um post sobre isso.

No entanto, também devo reconhecerExplicação de Hans que oThreadStatic De fato, o atributo não é gratuito e, de fato, depende de um método auxiliar do CLR para trabalhar sua mágica. Isso torna muito óbvio se seria uma otimização apropriada para aplicar em qualquer caso arbitrário.

A boa notícia para mim é que, emmeu Nesse caso, parece ter feito uma grande melhoria.

Eu tenho um método que (entre muitas outras coisas) instancia algumas matrizes de tamanho médio (~ 50 elementos) para algumas variáveis locais.

Após alguns perfis, identifiquei esse método como um gargalo de desempenho. Não é que o método demore muito tempo para chamar; ao contrário, é simplesmente chamadomuitos vezes, muito rapidamente (centenas de milhares a milhões de vezes em uma sessão, o que levará várias horas). Portanto, mesmo melhorias relativamente pequenas em seu desempenho valem a pena.

Ocorreu-me que, talvez, em vez de alocar uma nova matriz em cada chamada, eu pudesse usar os campos marcados[ThreadStatic]; sempre que o método é chamado, ele verifica se o campo foi inicializado no encadeamento atual e, se não, inicializa-o. A partir desse ponto, todas as chamadas no mesmo encadeamento terão uma matriz pronta para ser executada nesse ponto.

(O método inicializa todos os elementos da própria matriz, portanto, ter elementos "obsoletos" na matriz não deve ser um problema.)

Minha pergunta é simplesmente a seguinte: isso parece uma boa ideia? Existem armadilhas para usar oThreadStatic atributo dessa maneira (ou seja, como uma otimização de desempenho para reduzir o custo de instanciar novos objetos para variáveis locais) que eu deveria conhecer? O desempenho de umThreadStatic o próprio campo talvez não seja ótimo; por exemplo, há muitas "coisas" extras acontecendo em segundo plano, com seu próprio conjunto de custos, para tornar esse recurso possível?

Também é bastante plausível para mim que eu esteja errado em tentar otimizar algo tão barato (?) Quanto uma matriz de 50 elementos - e, se é assim, definitivamente me avise - mas ogeral pergunta ainda vale.

questionAnswers(3)

yourAnswerToTheQuestion