In welchen Situationen kann - während effizienter sein als während?

8

Während vs. do-while

while und do-while sind funktional äquivalent wenn die Blöcke leer sind , obwohl es zwar natürlicher erscheint:

%Vor%

Ein typischer Anwendungsfall von while / do-while mit einem leeren Block besteht darin, eine Aktualisierung von atomaren Objekten mit einem compareAndSet (CAS) zu erzwingen. Zum Beispiel erhöht der folgende Code a auf thread-sichere Weise:

%Vor%

Kontext

Mehrere Teile von java.util.concurrent verwenden das do {} while (...) idiom für CAS-Operationen und das Javadoc von ForkJoinPool erklärt:

  

Es gibt mehrere Vorkommen des ungewöhnlichen do {} while (!cas...) , was die einfachste Möglichkeit ist, eine Aktualisierung einer CAS-Variablen zu erzwingen.

Da sie zugeben, dass es ungewöhnlich ist, nehme ich an, dass sie am besten und nicht am einfachsten bedeuten.

Frage

Gibt es Situationen, in denen do {} while (!cas) effizienter sein kann als while (!cas) {} und aus welchen Gründen?

    
assylias 08.05.2013, 10:00
quelle

3 Antworten

2

Also bedeutet "do while", dass der Code einmal in der while-Schleife ausgeführt wird. Dann wird der Code nur innerhalb der while-Schleife ausgeführt, wenn die Bedingung wahr ist.

Einfache Demonstration

%Vor%

Ausgabe "dieser Text angezeigt"

Normal

%Vor%

Ausgabe ""

  • * Keine Ausgabe angezeigt, da die Bedingung falsch ist.

Warum oder wo du es tun würdest, während ich nicht über die Notwendigkeit gekommen bin, damit ich dir nicht helfen kann. Es geht nur darum, ein Problem / eine Notwendigkeit zu identifizieren und das zu nutzen, was Sie wissen, um es zu lösen. Ähnlich wie Lego - die mechanische Art nicht "blockiert".

    
kyle england 09.10.2014 15:38
quelle
0

Es kann Situationen geben, in denen die Berechnung von expect und update zu komplex ist, um in derselben Zeile lesbar zu sein, wie Sie compareAndSet aufrufen. Dann können Sie es in einem do besser lesbar machen:

%Vor%     
oe.elvik 08.05.2013 10:12
quelle
0

Dies ist keine Frage der Effizienz. Einige Fälle können nur ohne do {} while () gelöst werden. Schauen Sie sich java.util.Random.next (int Bits) an. Wenn Sie versuchen, dasselbe mit while () {} zu tun, würden Sie ein Code-Duplikat haben, weil der cycle body einmal vor der Bedingung ausgeführt werden muss.

Ich habe bereits eine sehr ähnliche Frage gestellt: Loops in Java kompilieren .

Dieser Code:

%Vor%

ist zusammengestellt in:

%Vor%

Möglicherweise bemerken Sie zusätzliche Anweisungen in Zeile 13 in method1 (). Aber wie durch die Antwort in meiner Frage vorgeschlagen wurde, hat dies keinen Unterschied, wenn es von JIT in Maschinenanweisungen kompiliert wird. Sehr schwer erreichbare Leistungsverbesserung. Um dies zu beweisen, müssen Sie mit dem PrintAssembly-Schlüssel arbeiten. Theoretisch ist Methode 2 schneller, aber in der Praxis sollten sie gleich sein.

    
Mikhail 08.05.2013 11:00
quelle