Zum Beispiel (Sagen wir, wir sprechen über C ++, wenn das einen Unterschied macht), In einem & amp; & amp; Operator, wenn ich weiß, dass eine Aussage zu 0 öfter führt / eine höhere Chance hat als die andere Aussage sollte ich das auf die linke Seite setzen, und die andere Aussage auf der rechten Seite?
Gleiches gilt für || Operator, wenn ich weiß, dass eine Aussage zu 1 öfter führt / eine höhere Chance hat als die andere Aussage, sollte ich das auf die linke Seite setzen, und die andere Aussage auf der rechten Seite?
Nun würde all dies viel Zeit für die Analyse des Programms kosten, aber wenn dies die Ausführungszeit für das Programm beschleunigt, ist es das wert, es zu tun, und das ist etwas, was Embedded- / Echtzeit-Systemprogrammierer untersuchen, um zu beschleunigen ihre Anwendung falls erforderlich?
Stellen Sie zuerst sicher, dass Sie kein Opfer der vorzeitigen Optimierung sind.
Stellen Sie sicher, dass Sie alles getan haben, um den Engpass Ihres Programms zu beschleunigen.
Das, was Sie über den Kurzschluss gesagt haben, mag in bestimmten Fällen eine gute Idee sein, aber das hängt stark von all Ihren Aussagen ab.
Wenn Sie beispielsweise Folgendes haben:
%Vor%Dann würden Sie wahrscheinlich wollen, dass der letzte Begriff der Erste ist, nicht wahr?
Seien Sie jedoch vorsichtig, Dinge sind nicht immer trivial in einer logischen Reihenfolge zu vertauschen. Überprüfen Sie zum Beispiel meine Antwort in Warum dieses Programm Gabel 4 gedruckt mal? , wo man sehen kann, dass ein Kurzschluss den Ablauf der Programmausführung beeinflussen kann.
TL; DR
Im Allgemeinen ist es jedoch selten, eine signifikante Beschleunigung zu erhalten, indem die Bedingungen in den Bedingungen permutiert werden. Konzentriere dich auf den Engpass deines Programms und nimm das so hart wie möglich an!
Es kommt darauf an. Wenn die Aussage so einfach ist wie:
%Vor%und nehme an, dass die Frequenz von x == 2 viel höher ist, so dass wir die Ausführung durch Schreiben wie folgt kurzschließen könnten:
%Vor%Aber Sie werden sehen, dass wir daraus keinen großen Nutzen ziehen werden, da die Aussagen sehr einfach sind und die Optimierung des Codes auf dieser Ebene vielleicht nicht so wertvoll ist.
Betrachten Sie nun ein Beispiel wie:
%Vor%Nehmen wir an, dass eine_expensive_function () eine sehr kostspielige Operation ist, sagen wir, dass die Komplexität exponentiell ist, und es definitiv sinnvoll ist, die Anweisung wie folgt zu setzen:
%Vor%zum Kurzschließen.
Eingebettete und Anwendungsentwickler oder jeder Entwickler in der ersten Instanz wird möglicherweise nicht in Betracht ziehen, bei solch einer feinen Granularität zu optimieren, wenn dies ihnen nicht viele Vorteile bringt. Sie denken vielleicht nicht einmal darüber nach, ob die Dinge gut für sie sind. Als Entwickler müssen wir also prüfen, wie viel Zeit es kostet, den Code auf einer solchen Ebene zu analysieren und zu optimieren, und wie viel Nutzen wir daraus ziehen.
Die Antwort auf die Frage lautet: Ja, es wirkt sich auf die Leistung aus.
Ob der Leistungsgewinn die Kosten für das Auffinden der Standorte, die verbessert werden können, und das Ändern des Programms wert ist, können Sie nur beantworten.
In den meisten Fällen wird die Leistungsänderung gering sein, aber wenn einige der involvierten Operationen kostspielig sind, kann das erheblich sein.
Seien Sie sich bewusst, dass es auch Auswirkungen auf die Korrektheit geben kann. Zum Beispiel, wenn in if (foo() || bar())
es wichtig ist, dass bar
niemals aufgerufen wird, wenn foo
wahr zurückgibt, dann wäre es ein Fehler, die Aufrufe neu zu ordnen.
Stellen Sie zunächst sicher, dass Ihr Programm korrekt ist. Dann if ist es zu langsam; Profilieren Sie es und optimieren Sie, wo es die größte Wirkung hat. Das kann die Reihenfolge der Auswertung in einem Kurzschlusskontext sein, aber in den meisten Fällen wird es etwas anderes sein.
Sie müssen auch überlegen, wie teuer die Bewertung jeder Seite ist.
%Vor%Wenn mehr als 50% Ihrer Quelle Ausdruckauswertungen und -verzweigungen sind, würde ich sagen, dass dies die letzte Optimierung ist, wenn Sie mit allem anderen zufrieden sind.
Die eingebetteten / Echtzeit-Anwendungsprogrammierer konzentrieren sich ungefähr in dieser Reihenfolge:
if
gibt, dann kann es ja helfen ... Sicher. wenn Ihr Konditional vom Form ist:
%Vor%und y ist teuer zu berechnen, und x ist billig und versagt oft, Dies verbessert die lokale Leistung des Codes.
Sie wollen also wissen:
In diesem Fall lohnt es sich normalerweise, die Elemente des Kurzschlussausdrucks neu anzuordnen.
Tags und Links c++ performance logical-operators short-circuiting