Je m'attendrais à ce que foreach fonctionne nominalement plus vite dans certains cas, et à peu près pareil dans d'autres, sauf dans les cas où les éléments sont un tableau réel, auquel cas la différence de performance est négligeable.
Si elle est mise en œuvre au-dessus d'un énumérateur, elle mai être plus efficace qu'une indexation directe, selon l'implémentation. Il est peu probable qu'elle soit moins efficace. Par exemple, si quelqu'un expose un arbre équilibré comme étant à la fois indexable et énumérable, alors foreach sera relativement plus rapide. C'est parce que chaque index devra trouver indépendamment l'élément référencé, tandis qu'un énumérateur a le contexte du nœud actuel pour naviguer plus efficacement vers le prochain ont.
Si vous avez un tableau réel, alors cela dépend de l'implémentation du langage et de la classe si foreach sera plus rapide que for.
Si l'indexation est un décalage de mémoire littéral (comme en C++), alors for devrait être légèrement plus rapide puisque vous évitez un appel de fonction. Si l'indexation est une indirection comme un appel, alors cela devrait être la même chose.
Tout cela étant dit... je trouve difficile de trouver un cas de généralisation ici. C'est le dernier type d'optimisation que vous devriez rechercher, même s'il y a un problème de performance dans votre application. Si vous avez un problème de performance qui peut être résolu en changeant la façon dont vous itérez, vous n'avez pas vraiment un problème de performance. Vous avez un BUT, parce que quelqu'un a écrit soit un itérateur vraiment mauvais, soit un indexeur vraiment mauvais.
7 votes
Une remarque rapide : si vous ne prévoyez pas de modifier la variable de la boucle foreach, vous devriez utiliser une const QString& à la place - cela a également des implications sur la vitesse.
0 votes
Voici une explication de la raison pour laquelle vous devez faire attention à inclure la const : labs.qt.nokia.com/2009/01/23/iterating-efficiently
1 votes
Le complément important à cette question est que vous ne devez jamais utiliser Qt
foreach
pour les conteneurs non Qt, il est fort probable qu'une copie profonde sera effectuée et c'est ce que vous ne voulez pas, même sans le profiler au préalable.2 votes
Depuis Qt 5.7, le
foreach
est dépréciée, voir ma réponse ci-dessous pour plus de détails.