Question

Lequel des éléments suivants présente les meilleures performances ?

J'ai vu la deuxième méthode implémentée en JavaScript avec d'énormes gains de performances, cependant, je n'ai pu mesurer aucun gain en C# et je me demandais si le compilateur exécutait déjà la méthode 2 même lorsqu'il était écrit comme la méthode 1.

La théorie derrière la méthode 2 est que le code n'a pas besoin d'accéder à DataTable.Rows.Count à chaque itération, il peut simplement accéder au int c.

Méthode 1

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

Méthode 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
Était-ce utile?

La solution

Non, il ne peut pas faire ça puisqu'il n'y a aucun moyen d'exprimer constante dans le temps pour une valeur.

Si le compilateur devait être capable de faire cela, le code renvoyant la valeur devrait garantir que la valeur est constante et qu'elle ne changera pas pendant la durée de la boucle.

Mais, dans ce cas, vous êtes libre d'ajouter de nouvelles lignes à la table de données dans le cadre de votre boucle, et c'est donc à vous de donner cette garantie, comme vous l'avez fait.

En bref, le compilateur ne fera pas cette optimisation si l'index de fin est autre chose qu'une variable.

Dans le cas d'une variable, où le compilateur peut simplement regarder le code de la boucle et voir que cette variable particulière n'est pas modifiée, il peut le faire et charger la valeur dans un registre avant de démarrer la boucle, mais tout gain de performances résultant de cela serait très probablement négligeable, à moins que le corps de votre boucle ne soit vide.

Conclusion:Si vous savez, ou êtes prêt à accepter, que l'index de fin de boucle est constant pendant toute la durée de la boucle, placez-le dans une variable.


Modifier: Relisez votre message et oui, vous constaterez peut-être également des gains de performances négligeables pour vos deux cas, car le JITter optimise le code.Le JITter peut optimiser votre lecture d'index de fin en un accès direct à la variable à l'intérieur de la table de données qui contient le nombre de lignes, et une lecture de mémoire n'est pas si chère de toute façon.Si, en revanche, la lecture de cette propriété était une opération très coûteuse, vous verriez une différence plus notable.

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