Pergunta

Qual das opções a seguir tem o melhor desempenho?

Já vi o método dois implementado em JavaScript com enormes ganhos de desempenho, porém, não consegui medir nenhum ganho em C# e queria saber se o compilador já executa o método 2 mesmo quando escrito como o método 1.

A teoria por trás do método 2 é que o código não precisa acessar DataTable.Rows.Count em cada iteração, ele pode acessar simplesmente o int c.

Método 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

Método 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
Foi útil?

Solução

Não, não pode fazer isso, pois não há como expressar constante ao longo do tempo por um valor.

Se o compilador fosse capaz de fazer isso, deveria haver uma garantia do código que retorna o valor de que o valor é constante e que durante o loop não será alterado.

Mas, neste caso, você está livre para adicionar novas linhas à tabela de dados como parte do seu loop e, portanto, cabe a você fazer essa garantia, da maneira que você fez.

Resumindo, o compilador não fará essa otimização se o índice final for diferente de uma variável.

No caso de uma variável, onde o compilador pode apenas olhar o código do loop e ver que esta variável específica não foi alterada, ele pode fazer isso e carregar o valor em um registro antes de iniciar o loop, mas qualquer ganho de desempenho com isso provavelmente seria insignificante, a menos que o corpo do loop estivesse vazio.

Conclusão:Se você sabe, ou está disposto a aceitar, que o índice final do loop é constante durante o loop, coloque-o em uma variável.


Editar: Releia sua postagem e, sim, você também poderá ver ganhos de desempenho insignificantes nos dois casos, porque o JITter otimiza o código.O JITter pode otimizar a leitura do índice final para um acesso direto à variável dentro da tabela de dados que contém a contagem de linhas, e uma leitura de memória não é tão cara assim.Se, por outro lado, ler aquela propriedade fosse uma operação muito cara, você veria uma diferença mais perceptível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top