DataTable laço Comparação de desempenho

votos
9

Qual dos seguintes tem o melhor desempenho?

Tenho o método dois implementada em JavaScript com enormes ganhos de desempenho visto, no entanto, eu era incapaz de medir qualquer ganho em C # e queria saber se o compilador já faz o método 2, mesmo quando escrita como método 1.

A teoria por trás o método 2 é que o código não tem que acessar DataTable.Rows.Count em cada iteração, ele pode simples acesso a 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
}
Publicado 07/08/2008 em 11:01
fonte usuário
Em outras línguas...                            


1 respostas

votos
4

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

Se o compilador deve ser capaz de fazer isso, não teria de ser uma garantia do código retornando o valor que o valor é constante, e para a duração do loop não vai mudar.

Mas, neste caso, você está livre para adicionar novas linhas à tabela de dados como parte de seu ciclo, e, portanto, cabe a você para fazer essa garantia, na forma como você tê-lo feito.

Assim, em breve, o compilador não vai fazer que a otimização se o índice final é outra coisa senão uma variável.

No caso de uma variável, onde o compilador pode apenas olhar para o código-loop e ver que esta variável em particular não for alterado, ele pode fazer isso e carregar o valor em um registrador antes de iniciar o loop, mas qualquer ganho de desempenho a partir deste seria mais provável ser insignificante, a menos que seu corpo do laço está vazio.

Conclusão: Se você conhece, ou está disposto a aceitar, que o índice de ciclo final é constante para a duração do loop, coloque-o em uma variável.


Edit: Re-ler o seu post, e sim, você pode ver ganhos de desempenho insignificantes para seus dois casos assim, porque o jitter otimiza o código. O jitter pode otimizar o seu índice final ler em um acesso direto à variável dentro da tabela de dados que contém a contagem de linhas, e uma memória de leitura não é tão caro de qualquer maneira. Se, por outro lado, a leitura que a propriedade foi uma operação muito cara, você veria uma diferença mais perceptível.

Respondeu 07/08/2008 em 11:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more