Wenn und sonst, sollte ich den wahrscheinlichen Teil setzen?

8

Ich habe mich gefragt, ob es einen großen Leistungsunterschied in den Sprachen gibt, ob Sie den Code mit höherer Wahrscheinlichkeit in der if oder in der else -Klausel verwenden sollten. Hier ist ein Beispiel:

%Vor%

und die andere Lösung

%Vor%     
Bartlomiej Lewandowski 01.08.2012, 16:37
quelle

11 Antworten

7

Lieber sie in die Reihenfolge bringen, in der der Code klarer wird, was normalerweise mit höherer Wahrscheinlichkeit zuerst ausgeführt wird.

    
pb2q 01.08.2012, 16:41
quelle
7

Wie andere sagten: In Bezug auf die Leistung sollten Sie sich am besten auf Ihren Compiler und Ihre Hardware verlassen (Verzweigungsvorhersage, spekulative Ausführung), um das Richtige zu tun.

Falls Sie wirklich besorgt sind, dass diese beiden Ihnen nicht genug helfen, bietet GCC eine eingebaute (__builtin_expect), mit dem Sie explizit das erwartete Ergebnis einer Verzweigung angeben können.

Was die Lesbarkeit des Codes betrifft, mag ich den wahrscheinlicheren Fall persönlich am besten.

    
BjoernD 01.08.2012 16:42
quelle
3

Wenn Sie kein Leistungsproblem feststellen, machen Sie sich keine Sorgen.

Wenn Sie ein Leistungsproblem feststellen, versuchen Sie, sie umzuschalten und messen , welche Variante schneller ist, falls eine von ihnen.

    
quelle
1
Die

Verzweigungsprognose bewirkt, dass eine dieser Wahrscheinlichkeiten wahrscheinlicher wird, und es wird eine Leistungsdifferenz verursachen, wenn sie sich innerhalb einer Schleife befindet. Aber meistens kannst du das ignorieren, wenn du nicht auf Assemblerebene denkst.

    
Markus Mikkolainen 01.08.2012 16:39
quelle
1

Die allgemeine Regel besteht darin, einen wahrscheinlichen Fall zuerst zu stellen, da dieser besser lesbar ist.

    
Danil Speransky 01.08.2012 16:40
quelle
0

Es macht meistens keinen Unterschied, aber manchmal ist es einfacher zu lesen und zu debuggen, wenn Ihr ifs prüft, ob etwas wahr oder gleich ist und das else handhabt, wenn das nicht der Fall ist.

    
edhedges 01.08.2012 16:41
quelle
0

Wie die anderen gesagt haben, wird es keinen großen Unterschied machen, es sei denn, Sie benutzen es viele Male (in einer Schleife zum Beispiel). Stellen Sie in diesem Fall die wahrscheinlichste Bedingung zuerst ein, da dies die frühestmögliche Gelegenheit hat, die Bedingungsprüfung abzubrechen.

Es wird offensichtlicher, wenn Sie viele 'else if's' haben.

    
Inisheer 01.08.2012 16:42
quelle
0

Jeder mögliche Unterschied hängt mehr mit dem Kontext zusammen als mit if-else constructions. Also das Beste, was Sie hier tun können, ist Ihre eigenen Tests zu entwickeln, um Unterschiede zu erkennen.

Wenn Sie ein bereits fertiggestelltes System oder eine Software nicht optimieren, sollten Sie vorzeitige Optimierungen vermeiden . Wahrscheinlich hast du schon gehört, dass sie böse sind.

    
Nicolás 01.08.2012 16:42
quelle
0

AFAIK mit modernen optimierenden C-Compilern gibt es keine direkte Beziehung zwischen wie Sie Ihre if oder Schleife organisieren und tatsächliche Verzweigung Anweisungen in generiertem Code. Außerdem haben verschiedene CPUs unterschiedliche Verzweigungsvorhersagealgorithmen.

Daher:

  • Optimieren Sie nicht, bis Sie mit diesem Code eine schlechte Leistung feststellen können

  • Wenn Sie verschiedene Versionen optimieren, messen und vergleichen

  • Verwenden Sie realistische Daten verschiedener Merkmale für die Leistungsmessung

  • Sehen Sie sich in beiden Fällen den Assembler-Code an, der von Ihrem Compiler generiert wurde.

Tomek Szpakowicz 01.08.2012 16:43
quelle
0

Dies ist nicht unbedingt ein Performance-Problem, aber ich gehe normalerweise von spezifisch zu allgemein, um solche Fälle zu verhindern:

%Vor%

Hier wird der obige Code nie "fizzbuzz" sagen, weil 15 die Bedingungen i % 3 == 0 und i % 5 == 0 erfüllt. Wenn Sie etwas genauer bestellen:

%Vor%

Nun wird der obige Code "fizzbuzz" erreichen, bevor er durch die allgemeineren Bedingungen gestoppt wird

    
Hunter McMillen 01.08.2012 16:43
quelle
0

Alle Antworten haben gültige Punkte. Hier ist eine zusätzliche:

  • Vermeiden Sie doppelte Negationen: wenn nicht das ist, dann ist das etwas anderes für den Leser verwirrend. Daher würde ich für das gegebene Beispiel bevorzugen:

    %Vor%
chqrlie 17.07.2017 10:58
quelle

Tags und Links