.NET caminho mais rápido para percorrer linhas em uma tabela de dados?
-
06-07-2019 - |
Pergunta
O que é geralmente mais rápida ao ler / comparar informações linha de uma DataTable?
'assume dt as datatable'
'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
....
next
'method 2'
dim row as datarow
for each row in dt.rows
....
next
E se há uma diferença, em que circunstâncias é que pagar para usar um sobre o outro?
Agradecemos antecipadamente por qualquer orientação!
Solução
Os expande compilador para cada um para um tempo curto circuito.
for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
row = e.Current
Então, você paga uma pequena quantidade de sobrecarga. Mas para clarities bem, eu ainda ia ficar com para cada um se você está trabalhando apenas em uma linha, e você não está modificando o conjunto de dados.
Outras dicas
Na realidade nenhuma diferença. Embora tecnicamente pagar um preço pequeno no método foreach, para atravessar a interface IEnumerable.
O segundo teria uma pena leve. No entanto, como para as circunstâncias, eu persoanlly sempre usar o método 2 para maior clareza de código. No entanto, gostaria de usar o método 1 se eu precisar fazer algo, como acessar a próxima / anterior linha ao analisar a linha atual.
Bem, há uma diferença, uma vez GetEnumerator e MoveNext que são chamados em foreach loop são virtuais (chamando requer passando por um ponteiro) e, portanto, não pode ser embutido. Esta sobrecarga na realidade é pequena, a menos que você faça um muito de loops.
Em alguns casos, embora o compilador irá substituir foreach com um para-loop (eu acredito que quando a iteração sobre matrizes).
Eu pessoalmente prefiro foreach no meu código ASP.NET MVC para maior clareza, como muitos já disseram aqui, mas muitas vezes usam a muito for-loop. Joe Duffy postou recentemente um artigo interessante sobre o custo de enumerar http://joeduffyblog.com/2008/09 / 21 / o do custo de enumerar-in-net /
@ gdean232 é certo - quase nenhuma diferença em tudo. Se o desempenho for um problema, usando um um SqlDataReader vez é perceptível mais rápido.
A implementação foreach é na verdade um pouco mais rápido do que o padrão para a implementação, porque cada acesso à matriz índice precisa ser limites marcada. No entanto, desde o idioma:
for(int i =0; i < myArray.Count; ++i)
{
// do something with myArray[i];
}
é comum, os olhares do compilador para ele como um caso especial e otimiza-lo, por isso se torna mais rápido. No entanto, qualquer pequeno desvio em relação ao formato (tal como int len ??= MyArray.Count; para (int i = 0; i