Frage

boolean a = false, b = true;
if ( a && b ) { ... };

In den meisten Sprachen, b wird nicht ausgewertet erhalten, weil a falsch ist so a && b kann nicht wahr sein. Meine Frage ist, würde nicht Kurzschlüsse langsamer in Bezug auf die Architektur? In einer Pipeline kann abgewürgt Sie nur während der Wartezeit zu erhalten sollte das Ergebnis ein, um zu bestimmen, ob b ausgewertet werden oder nicht? Wäre es besser, statt verschachtelten ifs zu tun? Gilt das auch helfen?

Auch weiß jemand, was Auswertung Kurzschluss wird in der Regel genannt? Diese Frage stellt sich, nachdem ich, dass meine Programmierung Freund Kurzauswertung nie und fand heraus, hatte erklärt, gehört, dass es nicht üblich ist, noch in vielen Sprachen zu finden, und ist ineffizient in der Pipeline. Ich bin nicht sicher über die letzte, so dass Sie Leute fragen!

Okay, denke ich, ein anderes Beispiel zu vielleicht erklären, wo mein Freund aus kommen könnte. Er glaubt, dass da parallel eine Aussage wie die folgende Auswertung:

(a) if ( ( a != null ) && ( a.equals(b) ) ) { ... }

wird das System zum Absturz bringen, eine Architektur, die nicht einen Kurzschluss (und damit nicht erlauben Aussagen wie die oben) wäre schneller wie diese bei der Verarbeitung von Anweisungen hat:

(b) if ( ( a == 4 ) && ( b == 5 ) )

da, wenn es nicht (a) parallel tun könnte, kann es nicht (b) parallel. In diesem Fall ist eine Sprache, die Kurzschlüsse erlaubt ist langsamer als eine, die nicht der Fall ist.

Ich weiß nicht, ob das wahr ist oder nicht.

Danke

War es hilfreich?

Lösung

Ein Kurzschließen Boolesche Ausdrücke sind genau äquivalent zu einem gewissen Satz von verschachtelten ifs, um so effizient wie das wäre.

Wenn b nicht Nebenwirkungen hat, kann es immer noch mit einem parallel ausgeführt werden (für jeden Wert von „parallel“, einschließlich Pipelining).

Wenn b Nebenwirkungen hat, die die CPU-Architektur nicht abbrechen kann, wenn die Verzweigungsvorhersage versagt, dann ja, könnte dies Verzögerungen erfordern, die es nicht sein würde, wenn beide Seiten immer ausgewertet. Also, es ist etwas zu sehen, wenn Sie finden Sie immer das Kurzschließen Betreiber einen Leistungsengpass in Ihrem Code erstellen, aber nicht wert, sich Gedanken über etwas anderes.

Aber ein Kurzschluss ist für die Ablaufsteuerung so viel verwendet als unnötige Arbeit zu speichern. Es ist üblich, bei Sprachen, die ich verwendet habe, zum Beispiel des Perl-Idiom:

open($filename) or die("couldn't open file");

das Shell-Idiom:

do_something || echo "that failed"

oder dem C / C ++ / Java / etc Idiom:

if ((obj != 0) && (obj->ready)) { do_something; } // not -> in Java of course.

In all diesen Fällen müssen Sie einen Kurzschluss, so dass die RHS nur, wenn der LHS ausgewertet werden diktiert, dass es sein sollte. In solchen Fällen gibt es keine Punkt zu vergleichen Leistung mit alternativem Code, der falsch ist!

Andere Tipps

Kurzschlussauswertung in Niederlassungen in Assembler-Sprache auf die gleiche Art und Weise übersetzt wird, wenn Aussagen (Zweige sind im Grunde eine goto), was bedeutet, es nicht langsamer, als wenn Aussagen sein wird.

Branchen tun Stall der Regel nicht die Pipeline, aber der Prozessor erraten, ob die Verzweigung genommen wird oder nicht, und wenn der Prozessor falsch ist, wird es hat alles zu spülen, was geschehen ist, da es die falsche Vermutung aus der Pipeline gemacht.

Kurzschlussauswertung ist auch die häufigste Namen für sie, und ist in den meisten Sprachen in irgendeiner Form oder eine andere gefunden.

Ich würde ehrlich gesagt nicht darum kümmern. Testen einer boolean ist wirklich schnell . Kurzschluss wird nur interessant / nützlich, wenn der zweite Ausdruck Nebenwirkungen hat:

if ( ConfirmAction() && DestroyAllData() )
   Reboot();

... oder abhängig von dem ersten Test:

if ( myDodgyVar != null && myDodgyVar.IsActive() )
   DoSomethingWith(myDodgyVar);

Sprachen unterstützt Kurzschluss:

Ada, Eiffel, 68 Algol, C1, C ++, C #, Java, R, Erlang, Standard ML, Javascript, MATLAB, Lisp, Lua, Schema, OCaml, Haskell, Pascal, Perl, Ruby, PHP, Python, Smalltalk , Visual Basic .NET

Genommen von Kurzschlussauswertung

VB.Net hat eine andere Syntax je nachdem, ob Sie es nicht zu Kurzschluss oder nicht. Aufgrund von Legacy-Gründen ist das Standardverhalten nicht kurzschließen. Die Syntax ist wie folgt

Nicht Kurzschluss

IF A And B THEN
    ...
END IF

Short Circuit

IF A AndAlso B THEN
    ...
END IF

Sie können mit Or / OrElse, wenn Sie einen Kurzschluss eine OR-Anweisung wollen. Das ist wirklich schön in Situationen wie die folgende ist

If MyObj IsNot Nothing AndAlso MyObj.Value < SomeValue Then
    ....
End If

Persönlich, während ich, dass Kurzschlüsse verstehen die Dinge beschleunigen kann, ist es definitiv nicht etwas, das von einem Blick auf den Code offensichtlich ist. Ich könnte ein unerfahrener Entwickler immer verwirrt durch das Verhalten sehen. Es scheint sogar, wie etwas, das oder nicht, je nach Compiler-Flags für Optimierungsgrade passieren könnte. Ich mag, wie VB ausführlich ist über welches Verhalten Sie wollen tatsächlich erreichen.

Zuerst Ihr Freund ist falsch. Kurzschlussauswertung (auch bekannt als minimal-Auswertung) ist in den meisten Sprachen und ist besser als verschachtelten ifs für parallele Sprachen (in diesem Fall die erste der Bedingungen, die die Ausführung bewirkt kehrt continue)

In jedem Fall, auch in einer einfachen nicht-parallelen Sprache, die ich sehe nicht, wie verschachtelter ifs schneller wäre als die Ausführung würde blockieren, bis die erste Bedingung ausgewertet wird.

Wie kann eine verschachtelte wenn nicht abgewürgt? Eigentlich, wenn a und b beide Variablen sind und keine Ausdrücke mit Nebenwirkungen, können sie parallel von einem guten Compiler geladen werden. Es gibt keinen Nutzen mehr ifs mit Ausnahme Ihrer Zeilenzahl zu erhöhen. Wirklich, würde dies die schlimmste Art von Sekunde einen Compiler zu erraten.

Es ist Kurzauswertung genannt.

Eine nützliche Kurzschluss ich benutze, ist so etwas wie folgt aus:

if (a != null && a.equals(somevalue)) {
    ... do something.
}

Das ist, meiner Meinung nach sehr gut lesbar und sehr gut funktioniert. Im Allgemeinen versuche ich zu viel Verschachtelung zu vermeiden, weil es zu hässlichen Code führt.

All meine Meinung aber.

Die meisten Sprachen tun Kurzauswertung von Booleschen Ausdrücken. Ich habe immer gehört, dass es als Kurzschlussauswertung bezeichnet.

Das Beispiel in der Frage ist ein ziemlich einfaches Beispiel, das wirklich nicht viel von einem Leistungsvorteil bieten. Der Leistungsvorteil kommt, wenn die Ausdrücke sind komplex zu bewerten.

Als Beispiel, wenn dies ein Spielprogramm wäre gut vorstellen, dass so etwas hat:

if (someObject.isActive() && someOtherObject.isActive() && CollisionDetection.collides(someObject, someOtherObject) {
  doSomething();
}

In diesem Fall wird die Kollisionserkennung ist weit teurer als die aktiven Prüfungen. Es wäre eine deutliche Leistungssteigerung, wenn es viele inaktive Objekte im System waren.

Kurzschluss, oder nur minimale Bewertung ist nur syntaktischer Zucker für verschachtelte ifs. Die Annahme, es ist ineffizient, oder verursacht Ständen ein Fall der vorzeitigen Optimierung ist. Zu diesem Zeitpunkt sind die meisten Compiler intelligent genug, um richtig zu interpretieren und diese Aussagen zu optimieren. Mit diesen Anweisungen kann Verschachtelung erheblich reduzieren und damit die Lesbarkeit des Codes verbessern, die Ihre Nummer eins Ziel sein sollte.

, ob und warum ein Kurzschluss effizient ist, Pipelining ist unwahrscheinlich, viel Einfluss auf die Leistung haben. In Situationen, in denen es eine Wirkung haben könnte, gibt es nichts, die Compiler aus Testen mehrere Bedingungen parallel zu stoppen, solange diese Tests keine Nebenwirkungen haben. Plus, moderner CPUs verfügt über mehrere Mechanismen, die für die Pipeline Leistung von branchy Code zu verbessern.

Verschachtelte ifs wird die gleiche Wirkung haben wie Kurzschließen &&.

‚Kurzschlussauswertung‘ ist die häufigste Namen für sie, und Ihr Freund ist falsch es ist ungewöhnlich; es ist sehr verbreitet.

Ich weiß nichts über Pipelining, aber Kurzauswertung ist ein gemeinsames Merkmal vielen Sprachen (und das ist auch der Name ich weiß es von). In C, && und die anderen Operatoren definieren eine Sequenzpunkt wie die rel="nofollow; Betreiber der Fall ist, so dass ich nicht sehen, wie Kurzauswertung ist nicht weniger effizient als nur mehrere Anweisungen.

Ich habe nur als Kurzschluss gehört. in einer Pipeline tat das nächste op, die in auf dem Ergebnis der if-Anweisung abhängig geht? wenn das der Fall ist dies optimiert würde so würde es zwei Werte hat jedes Mal zu testen.

Ein einzelner Thread ist sequentiell so, wenn Sie zwei haben ifs die ersten wird natürlich vor dem zweiten ausgewertet werden, so kann ich keinen Unterschied auf, dass sehen. Ich benutze den bedingungs AND-Operator (was && afaik genannt wird) viel mehr als verschachtelter ifs. Wenn ich etwas überprüfen möchten, die eine Weile dauern kann, zu bewerten, kann ich den einfacheren Test zuerst, dann die härtere nach dem bedingten und.

a = obj.somethingQuickToTest() && obj.somethingSlowToTest();

scheint nicht anders zu sein als

a = false;
if(obj.somethingQuickToTest())
   a = obj.somethingSlowToTest();

Je nach Kontext kann es auch „Guarding“ genannt werden.

Und ich habe es in fast jede Sprache gesehen, die ich in gearbeitet habe -., Die mit einem Dutzend der Nähe schiebt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top