Optimisation : Le for
Au cours d'une soirée du MVP Summit 2007, j'ai pu discuter avec Mitsu Furuta (Microsoft France) et Bruno Nati (MVP C++) et apprendre comment optimiser une boucle for (peu importe le langage utilisé).
Alors vous allez me dire "oui mais le for c'est nul vive les foreach". Certes c'est plus simple à utiliser mais une première optimisation c'est justement d'utiliser un for. Pourquoi ? Parce que le code ASM généré comporte une instruction en moins (une affectation).
Bon ça je le savais déjà, mais le plus étonnant est à venir. Voici ce qu'on a l'habitude de faire :
ArrayList ar = new ArrayList(); // On met X elements dans la liste (...)
// Puis on parcourt for(int i = 0; i < ar.Length; i++) { Console.WriteLine(ar[i].ToString()); } |
Et bien saviez vous que le code qui suit est plus performant ?
ArrayList ar = new ArrayList(); // On met X elements dans la liste (...) // Puis on parcourt for(int i = ar.Length - 1; i >= 0; i--) { Console.WriteLine(ar[i].ToString()); }
|
Pourquoi ? Je ne vais pas rentrer dans les détails parce que je ne maitrise pas vraiment, mais il se trouve que (tous) les processeurs arrêtent automatiquement les boucles une fois que l'index est arrivé à 0.
En fait il positionne automatiquement un flag une fois que cet index est arrivé à 0.
Comme cela est intégré directement dans les instructions du processeur, aucun cycle n'est nécessaire (ça ne coûte rien en temps d'exécution, ou en tout cas, infiniment moins qu'un test ou une affectation plus haut niveau).
Postée le 14/03/2007 par Aleks
Cette astuce est liée au projet
|