Was ist eine „enge Schleife“?

75

Ich habe diesen Satz viel gehört. Was heißt das?

Ein Beispiel würde helfen.

Friedrich der Narr
quelle
Ein Kontext, in dem Sie dies lesen, würde uns helfen, Ihre Frage zu verstehen. Könnten Sie ein Angebot, einen Link oder einen Hinweis geben?
S.Lott
1
Ich habe gerade gehört, dass im Büro darüber geredet wird. Ich habe den Kontext nicht ganz registriert. Ich glaube, ich war nur ein bisschen verärgert darüber, dass so viel darüber geredet wurde.
Frederick The Fool
1
Könnte sein, dass die Leute im Büro nur zufällige Schlagworte ausspucken. Oder nicht. Sie könnten sie fragen, was sie bedeuten.
S.Lott

Antworten:

52

Aus Wiktionary :

  1. (Computing) In Assemblersprachen eine Schleife, die nur wenige Anweisungen enthält und viele Male wiederholt wird.
  2. (Computing) Eine solche Schleife, die E / A- oder Verarbeitungsressourcen stark beansprucht und diese nicht angemessen mit anderen Programmen teilt, die im Betriebssystem ausgeführt werden.

Für Fall 1 ist es wahrscheinlich wie

for (unsigned int i = 0; i < 0xffffffff; ++ i) {}
kennytm
quelle
4
1) Das Beispiel ist keine enge Schleife, es ist ein NOP :) 2) Ich habe diesen Sinn in meinem Leben noch nie gesehen. Es klingt eher wie ein "Ressourcenschwein"
Karoly Horvath
1
Ein intelligenter (ish) Compiler mit einigen intelligenten (ish) Optimierungen wird ihn entfernen.
DJH
Wäre es kein while (condition == false) {}besseres Beispiel, von den obigen Kommentaren fortzufahren?
20.
Ich denke, diese Schleife und sogar die von @jdrd gepostete wird nur die gesamte Leistung eines CPU-Kerns nutzen. Warum benutzen die Leute es?
Minh Nghĩa
30

Ich denke, der Ausdruck wird im Allgemeinen verwendet, um eine Schleife zu bezeichnen, die viele Male iteriert und die die Leistung des Programms ernsthaft beeinträchtigen kann - das heißt, sie kann viele CPU-Zyklen verwenden. Normalerweise würden Sie diesen Satz in einer Diskussion über Optimierung hören.

Zum Beispiel denke ich an Spiele, bei denen eine Schleife möglicherweise jedes Pixel auf dem Bildschirm verarbeiten muss, oder an eine wissenschaftliche App, bei der eine Schleife Einträge in riesigen Arrays von Datenpunkten verarbeitet.

Strahl
quelle
3
Ein Teil des Codes, der häufig ausgeführt wird, ist möglicherweise ein guter Kandidat für die Optimierung, aber im Allgemeinen handelt es sich nicht um eine enge Schleife. Selbst wenn es häufig aufgerufen wird - wenn der Aufruf über mehrere Ebenen von Funktionen und Objekten erfolgt, ist er nicht "eng". Die Schleifenbedingung und die Schleifenanweisungen müssen sehr eng zueinander sein, Code in derselben Datei und denselben wenigen Zeilen für eine "enge Schleife".
foo
Ich habe die Art von Schleife gehört, die in der Antwort als "Hot Spot" in einem Programm beschrieben wird - ein Ort, an dem sich eine gezielte Optimierung auszahlt. Aus diesem Grund nannte Sun seine adaptive profilgesteuerte Just-in-Time-Kompilierungstechnologie "HotSpot".
Jeffrey Hantin
@foo: Sie müssen sich überhaupt nicht in derselben Datei befinden. Moderne Compiler können Abstraktionsebenen glücklicherweise in nichts verwandeln ... (z. B. C ++ - Vorlagen)
Karoly Horvath
12

Das Video Jon Skeet und Tony the Pony enthält ein gutes Beispiel für eine enge Schleife (~ Endlosschleife) .

Das Beispiel ist:

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

Dies erzeugt eine enge Schleife, da IndexOfein Unicode-Zeichen mit der Breite Null ignoriert wird (wodurch zwei benachbarte Leerzeichen gefunden werden), diese Replacejedoch nicht ignoriert werden (wodurch keine benachbarten Leerzeichen ersetzt werden).

Die anderen Antworten enthalten bereits gute Definitionen, daher erwähne ich sie nicht noch einmal.

AndiDog
quelle
9

Eine enge Schleife ist eine CPU-Cache-freundliche. Es ist eine Schleife, die in den Befehls-Cache passt, keine Verzweigung durchführt und die die Speicherabruflatenz für verarbeitete Daten effektiv verbirgt.

SandeepJ
quelle
4

Die Antwort von SandeepJ ist die richtige im Zusammenhang mit Netzwerkgeräten (siehe beispielsweise Wikipedia-Eintrag auf Middlebox), die sich mit Paketen befassen. Ich möchte hinzufügen, dass der Thread / die Task, die die enge Schleife ausführt, versucht, auf einer einzelnen CPU geplant zu bleiben und den Kontext nicht auszuschalten.

Deepak Mohanty
quelle
3

Laut Webster's Dictionary "Eine Codeschleife, die ausgeführt wird, ohne Ressourcen für andere Programme oder das Betriebssystem freizugeben."

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

Pawel J. Wal
quelle
Ich habe das gesehen, aber können Sie es anhand eines Beispiels veranschaulichen?
Frederick The Fool
3
Eigentlich bin ich mit dieser Definition nicht einverstanden. Da die meisten Schleifen solche Ressourcen nicht freigeben, bedeutet dies, dass die meisten Schleifen enge Schleifen sind.
2

Aus Erfahrung habe ich festgestellt, dass Sie, wenn Sie jemals versuchen, eine Schleife zu erstellen, die auf unbestimmte Zeit ausgeführt wird, zum Beispiel:

while(true)
{
    //do some processing
}

Eine solche Schleife ist höchstwahrscheinlich immer ressourcenintensiv. Wenn Sie die CPU- und Speicherauslastung durch den Prozess mit dieser Schleife überprüfen, werden Sie feststellen, dass sie in die Höhe geschossen ist. Dies ist die Idee, die manche Leute als "enge Schleife" bezeichnen.

ankapaul
quelle
0

Viele Programmierumgebungen setzen den Programmierer heutzutage nicht den Bedingungen aus, die eine enge Schleife erfordern, z. B. Java-Webdienste, die in einem Container ausgeführt werden, der Ihren Code aufruft, und Sie müssen Schleifen innerhalb einer Servlet-Implementierung minimieren / beseitigen. Systeme wie Node.js behandeln die enge Schleife, und auch hier sollten Sie Schleifen in Ihrem eigenen Code minimieren / beseitigen. Sie werden in Fällen verwendet, in denen Sie die vollständige Kontrolle über die Programmausführung haben, z. B. Betriebssystem oder Echtzeit- / eingebettete Umgebungen. Im Fall eines Betriebssystems können Sie sich vorstellen, dass sich die CPU im Leerlauf befindet, als die Zeit, die sie in der engen Schleife verbringt, da in der engen Schleife überprüft wird, ob andere Prozesse ausgeführt werden müssen oder ob sie vorhanden sind sind Warteschlangen, die gewartet werden müssen. Wenn also keine Prozesse ausgeführt werden müssen und die Warteschlangen leer sind, flitzt die CPU nur durch die enge Schleife und dies erzeugt einen fiktiven Hinweis darauf, wie "nicht beschäftigt" die CPU ist. Eine enge Schleife sollte so konzipiert sein, dass sie nur Überprüfungen durchführt, damit sie wie eine große Liste von if .. then-Anweisungen wird, sodass sie in Assembly auf einen COMPARE-Operanden und dann auf einen Zweig hinausläuft, sodass sie sehr effizient ist. Wenn alle Überprüfungen dazu führen, dass keine Verzweigung erfolgt, kann die enge Schleife millionenfach pro Sekunde ausgeführt werden. Betriebssysteme / eingebettete Systeme haben normalerweise eine gewisse Erkennung für CPU-Hogging, um Fälle zu behandeln, in denen ein Prozess die Kontrolle über die CPU nicht aufgegeben hat - Überprüfungen für diese Art von Vorkommen könnten in der engen Schleife durchgeführt werden. Letztendlich müssen Sie verstehen, dass ein Programm irgendwann eine Schleife haben muss, sonst könnten Sie mit einer CPU nichts Nützliches tun. Wenn Sie also nie die Notwendigkeit einer Schleife sehen, liegt dies daran, dass Ihre Umgebung all das für Sie erledigt. Eine CPU führt so lange Anweisungen aus, bis nichts mehr auszuführen ist oder Sie einen Absturz erleiden. Daher muss ein Programm wie ein Betriebssystem eine enge Schleife haben, damit es tatsächlich funktioniert, da es sonst nur Mikrosekunden lang ausgeführt wird. Letztendlich müssen Sie verstehen, dass ein Programm irgendwann eine Schleife haben muss, sonst könnten Sie mit einer CPU nichts Nützliches tun. Wenn Sie also nie die Notwendigkeit einer Schleife sehen, liegt dies daran, dass Ihre Umgebung all das für Sie erledigt. Eine CPU führt so lange Anweisungen aus, bis nichts mehr auszuführen ist oder Sie einen Absturz erleiden. Daher muss ein Programm wie ein Betriebssystem eine enge Schleife haben, damit es tatsächlich funktioniert, da es sonst nur Mikrosekunden lang ausgeführt wird. Letztendlich müssen Sie verstehen, dass ein Programm irgendwann eine Schleife haben muss, sonst könnten Sie mit einer CPU nichts Nützliches tun. Wenn Sie also nie die Notwendigkeit einer Schleife sehen, liegt dies daran, dass Ihre Umgebung all das für Sie erledigt. Eine CPU führt so lange Anweisungen aus, bis nichts mehr auszuführen ist oder ein Absturz auftritt. Daher muss ein Programm wie ein Betriebssystem eine enge Schleife haben, damit es tatsächlich funktioniert, da es sonst nur Mikrosekunden lang ausgeführt wird.

Jim R.
quelle