2008-08-07 39 views
8

Laquelle des performances suivantes est la meilleure?Comparaison des performances de la boucle DataTable

J'ai vu procédé à deux mises en œuvre en JavaScript avec d'énormes gains de performance, cependant, je ne pouvais pas mesurer tout gain en C# et je me demandais si le compilateur fait déjà la méthode 2, même lorsqu'il est écrit comme méthode 1.

Le 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 accéder facilement à l'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 
} 

Répondre

4

Non, il ne peut pas le faire car il n'y a pas moyen d'exprimer constante au fil du temps pour une valeur.

Si le compilateur devrait être capable de faire cela, il devrait y avoir une garantie du code retournant la valeur que la valeur est constante, et pour la durée de la boucle ne changera pas. 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 à vous de faire cette garantie, comme vous l'avez fait. Donc, en résumé, le compilateur n'effectuera pas cette optimisation si l'index final est autre chose qu'une variable. Dans le cas d'une variable, où le compilateur peut simplement regarder le code de boucle et voir que cette variable particulière n'est pas changée, il peut le faire et charger la valeur dans un registre avant de démarrer la boucle, mais tout le gain de performance de ce serait probablement négligeable, à moins que votre corps de boucle ne soit vide. Conclusion: Si vous savez ou êtes prêt à accepter que l'indice de fin de boucle est constant pendant la durée de la boucle, placez-le dans une variable.


Edit: Relisez votre message, et oui, vous pourriez voir des gains de performance négligeable pour vos deux cas également, parce que le JITter optimise le code. Le JITter peut optimiser votre lecture de l'index final en un accès direct à la variable dans la table de données qui contient le nombre de lignes, et une lecture en mémoire n'est pas si chère de toute façon. Si, d'un autre côté, lire cette propriété était une opération très coûteuse, vous verriez une différence plus notable.