2014-04-07 5 views
7

In meinem JPG-Decoder habe ich eine Schleife mit einer if-Anweisung, die je nach Bild immer wahr oder immer falsch sein wird. Ich könnte zwei getrennte Funktionen machen, um die if-Anweisung zu vermeiden, aber ich frage mich aus Neugierde, wie der Effekt auf die Effizienz einen Funktionszeiger anstelle der if-Anweisung verwenden würde. Es zeigt auf die Inline-Funktion, wenn es wahr ist, oder zeigt auf eine leere Inline-Funktion, wenn es falsch ist.Inline-Funktionszeiger zu vermeiden, wenn Anweisung

Könnte das schneller als eine if-Anweisung sein? Meine Schätzung ist nein, weil das Inline wird nutzlos sein, da der Compiler nicht wissen, welche Funktion zum Kompilieren inline und die Funktion Zeigeradresse Auflösung ist langsamer als eine if-Anweisung.

Ich habe mein Programm profiliert, und während ich einen merklichen Unterschied erwartet habe, habe ich keinen merklichen Unterschied festgestellt. Ich wundere mich nur aus Neugier.

+2

Kennen Sie über [Zweigvorhersage] (https://en.wikipedia.org/wiki/Branch_predictor)? Kommt das für dich rein? – Mike

+0

Ich habe erkannt, dass ich die if-Anweisung einfach wirklich vermeiden sollte, da sie immer wahr oder immer falsch ist. – deanresin

+0

@deanresin sollten Sie an Ihrer Namenskonvention arbeiten: 'trueorfalse',' dootherstuff'. – Mahdi

Antwort

8

Es ist sehr wahrscheinlich, dass die if-Anweisung schneller ist als das Aufrufen einer Funktion, da die if nur ein kurzer Sprung zum Overhead eines Funktionsaufrufs ist.

Dies wurde hier diskutiert: Which one is faster ? Function call or Conditional if Statement?

Die „Inline“ Schlüsselwort ist nur ein Hinweis an den Compiler zu sagen, um zu versuchen, die Anweisungen inline zu setzen, wenn es der Montage. Wenn Sie einen Funktionszeiger auf eine Inline verwenden, kann die Inline-Optimierung ohnehin nicht verwendet werden:

lesen: Do inline functions have addresses?

Wenn Sie das Gefühl, dass die if-Anweisung es zu viel verlangsamt, können Sie es völlig getrennt beseitigen könnten durch die Verwendung während Aussagen:

if (trueorfalse) { 
    while (kazillion) { 
     trueFunction(); 
     dootherstuff(); 
    } 
} else { 
    while (kazillion) { 
     dootherstuff(); 
    } 
} 
1

Vorsicht 1: Ich beantworte nicht wirklich die obige Frage, absichtlich. Will man im obigen Beispiel wissen, was es zwischen einer if-Anweisung und einem Funktionsaufruf über einen Zeiger schneller gibt, gibt mbonneau eine sehr gute Antwort.

Vorsicht 2: Das Folgende ist Pseudocode.

Abgesehen von Neugier, ich denke wirklich, man sollte sich nicht fragen, was schneller ist zwischen einer if-Anweisung und einem Funktionsaufruf, um seinen Code zu optimieren. Der Gewinn wäre sicherlich sehr klein und der resultierende Code könnte so verdreht sein, dass dies die Lesbarkeit und Wartung beeinträchtigen könnte.

Für meine Forschung, ich sorge mich über die Leistung, das ist eine grundlegende Vorstellung, bei der ich bleiben muss. Aber ich sorge mich mehr um Codepflege, und wenn ich zwischen einer guten Struktur und einer leichten Optimierung wählen muss, wähle ich definitiv die gute Struktur. Dann, wenn ich es wäre, würde ich den obigen Code wie folgt schreiben (Vermeidung von if-Anweisungen), indem ich eine Komposition durch eine Strategy Pattern verwende.

class MyStrategy { 
    public: 
    virtual void MyFunction(Stuff&) = 0; 
}; 

class StrategyOne : public MyStrategy { 
    public: 
    void MyFunction(Stuff&); // do something 
}; 

class StrategyTwo : public MyStrategy { 
    public: 
    void MyFunction(Stuff &stuff) { } // do nothing, and if you 
             // change your mind it could 
             // do something later. 
}; 

class jpg{ 
    public: 
    jpg(MyStrategy& strat) : strat(strat) { } 
    void func(Stuff &stuff) { return strat.MyFunction(stuff); } 
    private: 
    ... 
    MyStrategy strat; 
} 

main(){ 

    jpg a(new StrategyOne); 
    jpg b(new StrategyTwo); 
    vector<jpg> v { a, b }; 

    for(auto e : v) 
    { 
    e.func(); 

    dootherstuff(); 

    } 
} 
+0

Ich war unter dem Eindruck, dass [virtuelle Methoden sind im Wesentlichen die gleichen wie Funktionszeiger] (http://programmers.stackexchange.com/a/191641) in diesem Sinne; beide müssen gelöst werden, und die Lösung kann die Dinge verlangsamen. Ist das nicht wahr? – Mike

+0

@Mike Ja, das stimmt. Tatsächlich beantworte ich die hier gestellte Frage nicht wirklich, und ich sollte dies in meiner Antwort angeben (werde es jetzt tun). Mein Punkt ist, dass, selbst wenn es sich wirklich um Performances handelt (wie ich), ich nicht sicher bin, nach dem zu suchen, was schneller zwischen einer if-Anweisung und einem Funktionszeiger ist, ist die richtige Frage, wenn man einen Code optimiert. Was hier nicht der Fall ist, da Deanresin klar erklärte, es sei zur Befriedigung seiner Neugier. –