Question

Qu'est-ce qui est généralement le plus rapide lors de la lecture/comparaison des informations sur les lignes d'un 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

Et s’il y a une différence, dans quelles circonstances est-il préférable d’utiliser l’un plutôt que l’autre ?

Merci d'avance pour toute orientation !

Était-ce utile?

La solution

Le compilateur développe For Each en une boucle while courte.

for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
    row = e.Current

Donc, vous payez une petite quantité de frais généraux. Mais pour des raisons de clarté, je continuerai à utiliser For Each si vous ne travaillez que sur une ligne et que vous ne modifiez pas le jeu de données.

Autres conseils

En réalité, pas de différence. Bien que vous payiez techniquement un petit prix dans la méthode foreach, pour passer par l’interface IEnumerable.

Le second aurait une légère pénalité. Cependant, en ce qui concerne les circonstances, j’utiliserai toujours personnellement la méthode 2 pour clarifier le code. Cependant, j’utiliserais la méthode 1 si j’ai besoin de faire quelque chose, comme accéder à une ligne suivante / précédente tout en analysant la ligne actuelle.

Eh bien, il y a une différence, puisque GetEnumerator et MoveNext qui sont appelés pour chaque boucle sont virtuels (les appels nécessitent de passer par un pointeur) et ne peuvent donc pas être en ligne. En réalité, ces frais généraux sont minimes, à moins que vous beaucoup de boucles.

Dans certains cas, le compilateur remplacera foreach par une boucle for (je crois que lors de l'itération sur des tableaux).

Je préfère personnellement foreach dans mon code ASP.NET MVC pour la clarté, comme beaucoup l'ont dit ici, mais utilisent souvent la boucle for aussi. Joe Duffy a récemment publié un article intéressant sur le coût de l'énumération http://joeduffyblog.com/2008/09 / 21 / le-coût-de-énumération-en-net /

@ gdean232 a raison - pratiquement aucune différence. Si les performances posent problème, l’utilisation d’un SqlDataReader est plus visible à la place.

L'implémentation de foreach est en fait légèrement plus rapide que la norme d'implémentation, car chaque accès au tableau d'index doit être vérifié.Cependant, puisque l'expression :

for(int i =0; i < myArray.Count; ++i)
{
    // do something with myArray[i];
}

est courant, le compilateur le recherche comme un cas particulier et l'optimise pour qu'il devienne plus rapide.Cependant, tout petit écart par rapport à ce format (comme int len ​​= MyArray.Count;pour (int je =0;je< len;++i)) ne sera pas reconnu et utilisera le code le plus lent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top