2016-04-06 23 views
5

Ich werde versuchen, so klar wie ich kann mit meiner Frage (nicht einfach ... es ist nicht so klar für mich auch). Angenommen, Sie eine Reihe von IF haben ... THEN Befehle mit mehreren Operanden, zum BeispielAusführungsgeschwindigkeit von bedingten Anweisungen im Vergleich zu mathematischen Funktionen

IF ((a==0) && (b==1) && (c==1)) THEN x=1 
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2- 

und so weiter

nehme ich wie x = a * n1 + b * n2 + c * n3 (diese alle jene IFs mit einem einzigen mathematischen Funktion ersetzen könnte ist nur, um Ihnen eine Idee zu geben, in Wirklichkeit ist es komplexer, aber auch die IFs und Operanden sind viel mehr)

Die Funktion kommt von einem zuvor trainierten künstlichen neuronalen Netzwerk.

Mein Bauchgefühl ist, dass wenn es um Ausführung geht, die Funktion viel weniger Zeit als die IFs braucht, aber es ist nur ein Bauchgefühl aus meinem alten Hintergrund in der Montage, wo sie uns gelehrt haben, dass eine bedingte Anweisung den Weg freimacht mehr Zeit als eine arithmetische.

Können Sie das bestätigen? vielleicht sogar einen Link, wo ich eine Erklärung finden könnte?

Vielen Dank im Voraus Jungs!

+0

Ich denke, Ihr Bauchgefühl richtig ist. Ich habe hier ein paar Optimierungsfragen zu SO über überraschende Ergebnisse bei der Eliminierung von Verzweigungen verfolgt. –

+0

https://en.wikipedia.org/wiki/Branch_predictor und die Artikel, die es verlinkt, werden einen Anfang bieten. Die relativen Gewinne hängen von der Komplexität der Funktion und möglichen Verzweigungen ab, aber bei modernen Prozessoren sind häufig Pipeline- und Verzweigungsvorhersager relevant. – Peter

+2

Vielleicht sollten Sie zuerst überprüfen, dass Ihr Compiler [kann das nicht schon tun] (http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing-this-bit (Test), bevor Sie Ihr Programm fubar. Und natürlich * immer * verifiziere zuerst, dass es tatsächlich * einen Unterschied machen kann, benutze einen Profiler. Programmierers Diktum ist dreimal zu messen, einmal zu schneiden. –

Antwort

4

Ihr Bauchgefühl ist richtig.

Das Problem ist, dass moderne Prozessoren eine Pipeline haben, und in der Pipeline die nächsten x Anweisungen sequenziell zur Ausführung bereit geladen werden. Wenn Sie eine Verzweigung haben, eine if -Anweisung, dann weiß der Prozessor nicht, welchen Codepfad Sie als nächstes nehmen werden, und so rät er mit dem Verzweigungsprädiktor, aber wenn er es falsch bekommt, muss er es werfen aus der gesamten Pipeline und starten Sie wieder die richtige Verzweigung.

Branch Prädiktoren in modernen Prozessoren sind ziemlich gut, aber wenn Sie etwas haben, das eine 50/50 Chancen hat, in die eine oder andere Richtung zu gehen, werden Sie eine Menge von Pipeline-Ständen haben.

Aus diesem Grund ist das Eliminieren von if-Anweisungen besonders in engen Schleifen empfehlenswert.

Dies scheint eine gute Erklärung zu haben: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

+0

Denkst du für deine Antwort werde ich es überprüfen! – Maxyone

Verwandte Themen