Dans les programmes informatiques , une forme importante de contrôle de flux est la boucle qui provoque l'exécution d'un bloc de code plusieurs fois. Une expression courante consiste à avoir une boucle imbriquée dans une autre boucle, la boucle contenue étant communément appelée boucle interne.
Arrière-plan
Dans de nombreux langages, il existe deux principaux types de boucles, qui peuvent être imbriquées l'une dans l'autre dans plusieurs couches d'imbrication. Les deux types sont les boucles for et les boucles while. Elles sont légèrement différentes dans leur forme mais ont le même effet. Des recherches ont montré que les performances de la structure complète d'une boucle avec une boucle interne sont différentes par rapport à une boucle sans boucle interne. En effet, même les performances de deux boucles avec différents types de boucle interne, où l'une est une boucle for et l'autre une boucle while, sont différentes.
Il a été observé que plus de calculs sont effectués par unité de temps lorsqu'une boucle for interne est impliquée que dans le cas contraire. Cela implique que, compte tenu du même nombre de calculs à effectuer, celui avec une boucle for interne finira plus rapidement que celui sans elle. Il s'agit d'une technique d' optimisation de boucle indépendante de la machine ou de la plate-forme et a été observée dans plusieurs langages de programmation et compilateurs ou interprètes testés. Le cas d'une boucle while comme boucle interne a mal fonctionné, fonctionnant même plus lentement qu'une boucle sans boucle interne dans certains cas. Deux exemples ci-dessous écrits en python présentent une boucle while avec une boucle for interne et une boucle while sans boucle interne. Bien que les deux aient la même condition de terminaison pour leurs boucles while, le premier exemple se terminera plus rapidement en raison de la boucle for interne. La variable innermax est une fraction de la variable maxticketno dans le premier exemple.
tant que ticket_no * innermax < max_ticket_no : pour j dans la plage ( 0 , innermax ): si ( ticket_no * innermax + j ) == jackpot_no : retour ticket_no += 1
tant que ticket_no < max_ticket_no : si ticket_no == jackpot_no : retour ticket_no += 1