web-dev-qa-db-fra.com

Qu'est-ce qu'une "boucle serrée"?

J'ai beaucoup entendu cette phrase. Qu'est-ce que ça veut dire?

Un exemple serait utile.

70
Frederick The Fool

De Wiktionnaire :

  1. (informatique) Dans les langages d'assemblage, une boucle qui contient peu d'instructions et itère plusieurs fois.
  2. (informatique) Une telle boucle qui utilise fortement les E/S ou les ressources de traitement, sans les partager correctement avec d'autres programmes exécutés dans le système d'exploitation.

Pour le cas 1, c'est probablement comme

for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
44
kennytm

Je pense que l'expression est généralement utilisée pour désigner une boucle qui itère plusieurs fois et qui peut avoir un effet sérieux sur les performances du programme - c'est-à-dire qu'elle peut utiliser beaucoup de cycles CPU. Habituellement, vous entendez cette phrase dans une discussion sur l'optimisation.

Par exemple, je pense au jeu, où une boucle peut avoir besoin de traiter chaque pixel de l'écran, ou à une application scientifique, où une boucle traite des entrées dans des tableaux géants de points de données.

27
Ray

Il y a un bon exemple d'une boucle serrée (~ boucle infinie) dans la vidéo Jon Skeet et Tony the Pony .

L'exemple est:

while(text.IndexOf("  ") != -1) text = text.Replace("  ", " ");

qui produit une boucle serrée car IndexOf ignore un caractère Unicode de largeur nulle (trouve donc deux espaces adjacents) mais Replace ne les ignore pas (ne remplaçant ainsi aucun espace adjacent).

Il y a déjà de bonnes définitions dans les autres réponses, donc je ne les mentionne plus.

8
AndiDog

Une boucle serrée est une boucle compatible avec le cache du processeur. Il s'agit d'une boucle qui tient dans le cache d'instructions, qui ne fait pas de branchement et qui masque efficacement la latence de récupération de la mémoire pour les données en cours de traitement.

5
SandeepJ

La réponse de SandeepJ est la bonne dans le contexte des appliances réseau (par exemple, voir l'entrée Wikipedia sur le boîtier de médiation) qui traitent des paquets. Je voudrais ajouter que le thread/la tâche exécutant la boucle étroite tente de rester planifié sur un seul processeur et de ne pas désactiver le contexte.

3
Deepak Mohanty

Selon le dictionnaire de Webster, "Une boucle de code qui s'exécute sans libérer de ressources vers d'autres programmes ou le système d'exploitation."

http://www.websters-online-dictionary.org/ti/tight+loop.html

2
Pawel J. Wal

Par expérience, j'ai remarqué que si jamais vous essayez de faire une boucle qui s'exécute indéfiniment, par exemple quelque chose comme:

while(true)
{
    //do some processing
}

Une telle boucle sera très probablement toujours gourmande en ressources. Si vous vérifiez l'utilisation du CPU et de la mémoire par le processus avec cette boucle, vous constaterez qu'elle aura augmenté. Telle est l'idée que certains appellent une "boucle étroite".

1
ankapaul