2016-07-22 2 views
7

Zum Beispiel (Lets sagen, wir sprechen über C++, wenn das einen Unterschied macht), In einem & Operator, wenn ich weiß, dass eine Aussage zu 0 führt häufiger/hat eine höhere Chance als die andere Aussage sollte ich das setzen auf der linken Seite, und die andere Aussage auf der rechten Seite?Führt ein Kurzschluss zu einer schnelleren Ausführung des Programms und analysiert er, welche Aussage zuerst in die Bedingungserklärung geschrieben werden muss?

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?

Jetzt würde all dies eine Menge Zeit für die Analyse des Programms verursachen, aber wenn dies die Ausführungszeit für das Programm beschleunigt, lohnt es sich, es zu tun, und das ist etwas, in das Embedded/Echtzeit-Systemprogrammierer schauen Beschleunigen Sie ihre Anwendung bei Bedarf?

+4

* Ist es das wert, es zu tun * wird von vielen Faktoren abhängen. Der größte ist, wie viel kostet es, diese Abstimmung zu tun und wie viel sparen Sie von der zusätzlichen Leistung. – NathanOliver

+0

im Prinzip ja, das ist der Grund, warum die Shortcircuit-Operatoren existieren – user463035818

+0

Ist das ein letzter Versuch, die Leistung von Embedded-Anwendungen zu verbessern (mit harten Deadlines), oder ist es etwas, was sie tatsächlich zur Verbesserung der Performance tun? –

Antwort

4

Erstens, stellen Sie sicher, dass Sie nicht ein Opfer von vorzeitige Optimierung sind .

Mit diesem gesagt, stellen Sie sicher, dass Sie alles getan haben, um den Engpass Ihres Programms zu beschleunigen.


tun, was Sie über das Kurzschließen der kann eine gute Idee in bestimmten Fällen sein, aber das ist, hängt stark alle Ihre Aussagen.

Zum Beispiel, wenn Sie so etwas wie:

if(slowFunction() && complexConditionRootsAndExponents && ConditionUsuallyZero) 

dann würden Sie wahrscheinlich wollen, dass letztes Glied ersten sein, würden Sie nicht?

Seien Sie jedoch vorsichtig, Dinge sind nicht immer trivial in einer logischen Reihenfolge zu vertauschen. Überprüfen Sie zum Beispiel meine Antwort in Why this program printed fork 4 times?, wo man sehen kann, dass Kurzschluss den Ablauf der Ausführung des Programms beeinträchtigen kann.


TL; DR

Im Allgemeinen jedoch ist es selten signifikante Beschleunigung zu erhalten, indem die Bedingungen in den Bedingungen Permutation. Konzentriere dich auf den Flaschenhals deines Programms und nimm das so hart wie möglich an!

+1

Vielen Dank für das Beispiel und die Referenz. Ja, ich wusste nicht, dass eine vorzeitige Optimierung ein Ding war, aber ich verstehe es jetzt, da der Flaschenhals zuerst angegangen werden sollte! –

+1

Sie sind herzlich willkommen @OmidCompSCI. Sie haben eine gute Frage gestellt, ich hatte das vor einigen Jahren auch gefragt, und ich habe den Fehler gemacht, zu versuchen, dies zu optimieren, und nicht den Flaschenhals. Und es machte keinen Unterschied. Optimieren Sie jedoch den Flaschenhals Ihres Programms wird sicherlich schöne Ergebnisse bringen! :) Viel Glück. – gsamaras

3

Sie müssen auch berücksichtigen, wie teuer die Auswertung jeder Seite ist.

if (veryCostlyOftenFalse() && veryCheapRareFalse()) // may be faster other way around 

Falls nicht mehr als 50% der Quelle sind Ausdruck Auswertungen und Verzweigung, würde ich sagen, das letztinstanzliche Optimierung ist, wenn Sie mit allem zufrieden sind.


Die eingebetteten/Echtzeit-Anwendung Programmierer konzentrieren sich etwa in dieser Reihenfolge:

  1. Algorithmus natürlich vs Raum vernünftigen Kompromiss in der Geschwindigkeit zu finden.
  2. Datenstrukturen im Speicher (die Caches so oft wie möglich treffen, wenn sie von diesen Algorithmen ausgeführt werden).
  3. Profiling der realen Anwendung mit realen Daten, um zu sehen, ob es einige unerwartete Engpässe gibt und diese zu beheben.
  4. , wenn Sie verzweifelt irgendwo eine Uhr oder zwei fehlen, und es gibt einige komplexe if um, dann ja, kann es helfen, ...
+0

Danke, dass Sie mir sagen, auf was sich Embedded/Echtzeit-Programmierer konzentrieren. –

4

Die Antwort auf die Frage lautet: Ja, es hat Auswirkungen auf die Leistung.

Ob die Leistungssteigerung die Kosten für das Finden der Standorte, die verbessert werden können, und das Ändern des Programms lohnt, können Sie nur beantworten.

In den meisten Fällen wird die Leistungsänderung klein sein, aber wenn einige der beteiligten Operationen kostspielig sind, kann es erheblich sein.

Beachten Sie, dass es auch Korrektheitsauswirkungen geben kann. Zum Beispiel, wenn in if (foo() || bar()) es wichtig ist, dass bar nie aufgerufen wird, wenn foo wahr zurückgibt, dann wäre es ein Fehler, die Anrufe neu zu ordnen.

Beginnen Sie, indem Sie sicherstellen, dass Ihr Programm korrekt ist. Dann ist wenn es zu langsam ist; Profilieren Sie es und optimieren Sie, wo es die größte Wirkung hat. Das kann die Reihenfolge der Auswertung in einem Kurzschluss-Kontext sein, aber in den meisten Fällen wird es etwas anderes sein.

+1

Vielen Dank, es scheint, als wäre es wichtiger, den Engpass zu finden, als nach diesen kleinen Dingen zu suchen, da es scheint, dass Kosten größer sind, als diese Fälle in den meisten Szenarien zu finden. –

5

Kommt drauf an. Wenn die Aussage ist so einfach wie:

if(y == 4 || x == 2) 

und diese Frequenz von x == 2 annimmt, ist viel höher, so dass wir durch das Schreiben wie kurzgeschlossen, die Ausführung haben könnten:

if(x == 2 || y == 4) 

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 möglicherweise nicht so wertvoll ist.

Betrachten wir nun ein Beispiel wie:

if(y == an_expensive_function() || x == 2) 

Hier nehmen an_expensive_function() ist sehr kostspieliger Vorgang, sagen, es ist die Komplexität wie exponentiell ist, die auf jeden Fall macht es Sinn, die Aussage zu stellen wie:

if(x == 2 || y == an_expensive_function()) 

Kurzschlüsse durchführen.

Eingebettete und Anwendungsentwickler oder jeder Entwickler in der ersten Instanz könnte die Optimierung bei einer solch feinen Granularität nicht in Erwägung ziehen, 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 braucht, um den Code auf einer solchen Ebene zu analysieren und zu optimieren und wie viel Nutzen wir daraus ziehen.

+0

Vielen Dank für die Erklärung und gutes Beispiel zu verstehen! Und anscheinend sagt jeder, dass niemand den Code wirklich so fein abstimmt, und es ist wichtig, den Engpass zuerst zu lösen, bevor er ins Detail geht. –

3

Sicher.wenn Ihr bedingter von der Form:

if (x() && y()) ... 

und y teuer zu berechnen, und x ist billig und oft nicht, dies die lokale Leistung des Codes verbessern.

So möchten Sie wissen:

  • sind die bedingte in einem leistungs empfindlichste Teil des Programms (falls nicht, kein Sinn, es zu optimieren, schreibt für Klarheit)
  • relativ Kosten der Komponente Berechnungen des Kurzschlussausdrucks
  • , die billige Berechnungen fehlschlagen (für & &) oder erfolgreich (für ||) häufig.

In diesem Fall lohnt es sich normalerweise, die Elemente des Kurzschlussausdrucks neu anzuordnen.

+0

Vielen Dank für das kurze und einfache Beispiel und Erklärung. Scheint wie die meisten Menschen sagen in einfachen Szenarien wie diese ist es am besten, sie neu anordnen, um die Leistung zu verbessern, in komplexen Situationen die Kosten für die Analyse wäre viel größer als die Leistung, wenn eine Verbesserung. Sieht so aus, als würde der Schlüssel den Flaschenhals der Performance abbauen! Vielen Dank. –

+2

FWIW, wenn ich solche Bedingungen schreibe, versuche ich, das Urteil über die Reihenfolge zu fällen, wie ich es schreibe, basierend auf dem, was ich weiß. Manche mögen diese vorzeitige Optimierung nennen; Ich glaube nicht, dass die Redewendung verdient ist.Wenn die Bedingung selten ausgeführt wird, spielt es keine Rolle, ob die Bestellung falsch ist. Wenn sich die Bedingung zufällig herausstellt, um in einem heißen Pfad zu sein, dann ist die Reihenfolge in dem von mir geschätzten Grad richtig, und ich muss diesen Ort nicht mit einem Profiler finden und ihn später korrigieren; Mein Code ist bereits abgestimmt. Wenn ich das überall gemacht habe, läuft mein Code generell besser. –

Verwandte Themen