Setzt eine Funktion in einer if-Anweisung effizient? (C++)
Ich habe gesehen, Aussagen wie diese
if(SomeBoolReturningFunc())
{
//do some stuff
//do some more stuff
}
und Frage mich, ob putting eine Funktion in einer if-Anweisung ist effizienter, oder wenn es gibt Fälle, wenn es besser wäre, Sie zu verlassen trennen, wie dies
bool AwesomeResult = SomeBoolReturningFunc();
if(AwesomeResult)
{
//do some other, more important stuff
}
...?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, was macht Sie denken, dass die Zuweisung das Ergebnis des Ausdrucks zu einer Variablen ersten wäre effizienter als die Auswertung des Ausdrucks selbst, aber es ist nie egal, so wählen Sie die option, das erhöht die Lesbarkeit des Codes. Wenn Sie wirklich wissen wollen, schauen Sie sich die Ausgabe Ihres Compilers und sehen, ob es da Unterschiede gibt. Auf die Mehrzahl der Systeme gibt dies wird wahrscheinlich Ergebnis in identischen Maschinencode.
entweder Weg, sollte es egal sein. die grundlegende Idee ist, dass das Ergebnis wird gespeichert in einer temporären Variablen, egal was, ob Sie es benennen kann oder nicht. Die Lesbarkeit ist wichtiger heutzutage, da Computer sind normalerweise so schnell, dass die kleinen tweaks nicht so viel darum.
Habe ich sicher gesehen, wenn (f()) {bla;} produzieren effizienteren code als bool r = f(); if (r) {bla;}, aber das war vor vielen Jahren auf einem 68000.
Diesen Tagen, ich würde auf jeden Fall wählen Sie den code, der einfacher zum Debuggen. Ihre Ineffizienzen sind weit wahrscheinlicher zu sein, Ihre Methode vs. die code-compiler generiert.
wie schon andere gesagt haben, im Grunde macht keinen wirklichen Unterschied in der Leistung, in der Regel in C++ die meisten performance-Gewinne auf der reinen code-Ebene (im Gegensatz zum Algorithmus) sind im loop-unrolling.
vermeiden Sie außerdem Verzweigung insgesamt geben kann Weise mehr Leistung, wenn die Bedingung in einer Schleife.
beispielsweise durch separate loops für jede bedingte Fall-oder Aussagen, die inhärent berücksichtigt die Bedingung (vielleicht durch die Multiplikation von einem term durch 0, wenn Ihr nicht wollte)
und dann können Sie mehr von unrolling loop
Template-code kann helfen, eine Menge mit diesem in einem "semi" saubere Art und Weise.
Gibt es auch die Möglichkeit,
🙂
IMO, die Art von Aussagen, die Sie gesehen haben, sind klarer zu Lesen und weniger fehleranfällig:
Beide Varianten in der Regel produzieren die gleiche Maschine code, und führen exakt gleich. Sehr selten gibt es einen performance-Unterschied und selbst in diesen Fällen ist es unwahrscheinlich, dass ein Flaschenhals (die sich in nicht die Mühe, vor der Profilierung).
Den signifikanten Unterschied ist in debugging und Lesbarkeit. Mit einer temporären variable, es ist leichter zu Debuggen. Ohne die variable der code ist kürzer und vielleicht mehr lesbar.
Wenn Sie möchten beide einfach zu Debuggen und einfacher zu Lesen code, den Sie sollten besser deklarieren Sie die variable als
const
:diese Weise ist es deutlicher, dass die Variablen nie zugewiesen, um wieder und es gibt keine andere Logik hinter seiner Erklärung.
Beiseite alle debugging erleichtern oder Lesbarkeit Probleme, und solange der Funktion zurückgegebene Wert ist nicht in den if-block; es scheint mir, dass die Zuweisung des zurückgegebenen Wertes an eine variable führt nur dazu, dass eine zusätzliche Verwendung des = - operators und eine zusätzliche bool-variable auf dem stack gespeichert Raum - ich könnte weiter spekulieren, dass eine zusätzliche variable in den stack-Speicher verursacht die Latenzzeit im weitere stack-Zugriffe (nicht sicher wenn).
Die Sache ist, diese sind wirklich kleinere Probleme und wie lange hat der compiler eine Optimierung Flagge auf, sollte dazu führen, dass keine Ineffizienz. Ein anderer Fall ist, würde ich prüfen, wäre ein embedded-system - dann wieder, wie viel Schaden konnte ein Einzel -, 8-bit-variable Ursache? (Ich habe absolut keine Kenntnisse über embedded Systeme, damit vielleicht jemand anderes, könnte Ihnen dies erläutern?)
Den AwesomeResult version schneller sein können, wenn SomeBoolReturningFunc() ist ziemlich langsam, und Sie werden in der Lage zu verwenden AwesomeResult mehr als einmal zu fordern, anstatt SomeBoolReturningFunc() wieder.
Platzierung der Funktion innerhalb oder außerhalb der if-Anweisung egal. Es gibt keinen performance-Gewinn oder Verlust. Dies ist, weil der compiler automatisch einen Platz auf dem stack für den Wert -, ob oder nicht Sie haben explizit eine variable definiert.
Im performance-tuning, die ich getan habe, dies wäre nur darüber nachgedacht, in der letzten Phase des Zyklus-Rasur nach der Reinigung aus einer Reihe von erhebliche performance-Probleme.
Ich scheine zu erinnern, dass eine Anweisung pro Zeile wurde die Empfehlung des Buches Der Code Vollständig Ist, wo es wurde argumentiert, dass ein solcher code ist einfacher zu verstehen. Machen Sie jede Anweisung, die eine und nur eine Sache so, dass es sehr einfach zu sehen, sehr schnell auf einen Blick was ist passiert im code.
Ich persönlich mag die Rückgabewerte in Variablen, um Sie leichter zu kontrollieren (oder auch ändern) in den debugger.
Einer Antwort erklärt, dass ein Unterschied beobachtet wurde im generierten code. Ich bezweifle, dass mit einem optimierenden compiler.
Einen Nachteil, vor C++11, für mehrere Zeilen ist, dass Sie haben, um zu wissen, die Art der Gegenleistung für die Deklaration von Variablen. Zum Beispiel, wenn die Rücksendung geändert von bool zu int dann je nach den Arten beteiligt haben, könnten Sie einen abgeschnittenen Wert in der lokalen Variablen (was machen die, wenn Fehlfunktionen). Wenn das kompilieren mit C++11 aktiviert, dies kann gelöst werden, indem man mit dem auto-Schlüsselwort, in:
Stroustrup ' s C++ 4. Auflage empfiehlt, die Deklaration von Variablen in der if-Anweisung selbst, so wie in:
Sein argument ist, dass diese Grenzen den Gültigkeitsbereich der Variablen so weit wie möglich. Ob oder nicht, dass ist mehr lesbar (oder debugfähiger) ist ein Urteil-Aufruf.