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:
und die andere Lösung
%Vor%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.
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.
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.
Die allgemeine Regel besteht darin, einen wahrscheinlichen Fall zuerst zu stellen, da dieser besser lesbar ist.
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.
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.
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.
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:
Nun wird der obige Code "fizzbuzz" erreichen, bevor er durch die allgemeineren Bedingungen gestoppt wird
Tags und Links c if-statement flow-control