sind 2 ^ n Exponentenberechnungen wirklich weniger effizient als Bitverschiebungen?

8

wenn ich das tue:

%Vor%

Ist das wirklich viel weniger effizient als nur zu tun?

%Vor%

?

    
patrick 23.09.2012, 22:43
quelle

4 Antworten

20

Ja. Eine einfache Möglichkeit, dies zu zeigen, besteht darin, die folgenden zwei Funktionen zu kompilieren, die dasselbe tun und dann die Disassemblierung betrachten.

%Vor%

cc -arch armv7 -O3 -S -o - shift.c (Ich finde ARM asm einfacher zu lesen, aber wenn du x86 willst, entferne einfach das arch-Flag)

%Vor%

Sie können sehen, dass foo2 nur 2 Anweisungen gegen foo1 benötigt, was mehrere Anweisungen erfordert. Er muss die Daten in die FP-HW-Register verschieben ( vmov ), die Ganzzahl in einen Float ( vcvt.f64.u32 ) umwandeln, die exp -Funktion aufrufen und die Antwort dann wieder in eine Uint ( vcvt.u32.f64 ) umwandeln und verschieben es von der FP HW zurück zu den GP-Registern.

    
James 24.09.2012, 01:23
quelle
3

Ja. Obwohl, wie viel kann ich nicht sagen. Der einfachste Weg, dies zu bestimmen, ist es, es zu benchmarken.

Die Funktion pow verwendet Double ... Zumindest, wenn sie dem C-Standard entspricht. Selbst wenn diese Funktion Bitshift verwendet, wenn sie eine Basis von 2 sieht, würde es immer noch Tests und Verzweigungen geben, um zu dieser Schlussfolgerung zu kommen, zu welcher Zeit Ihr einfaches Bitshift beendet wäre. Und wir haben noch nicht einmal den Overhead eines Funktionsaufrufs in Betracht gezogen.

Bei Äquivalenz gehe ich davon aus, dass Sie 1 << x anstelle von 1 << 4 verwenden möchten.

Vielleicht könnte ein Compiler beide optimieren, aber es ist viel weniger wahrscheinlich, einen Aufruf von pow zu optimieren. Wenn Sie den schnellsten Weg benötigen, um eine Potenz von 2 zu berechnen, tun Sie dies mit dem Verschieben.

Update ... Da ich erwähnt habe, dass es einfach ist, Benchmarks zu erstellen, habe ich mich entschlossen, genau das zu tun. Ich habe Windows und Visual C ++ praktisch, also habe ich das benutzt. Die Ergebnisse werden variieren. Mein Programm:

%Vor%

Meine Ausgabe:

%Vor%     
paddy 23.09.2012 22:49
quelle
1

Generell ja, da Bit-Shift eine sehr einfache Operation für den Prozessor ist.

Auf der anderen Seite optimieren viele Compiler den Code, so dass das Hochfahren tatsächlich nur ein bisschen verschoben ist.

    
Michał Miszczyszyn 23.09.2012 22:48
quelle
0

Das hängt vom Compiler ab, aber im Allgemeinen (wenn der Compiler nicht vollständig gehackt ist) ja, die Verschiebung ist eine CPU-Anweisung, die andere ist ein Funktionsaufruf, der das Speichern des aktuellen Status und das Einrichten eines Stack-Frames beinhaltet. Das erfordert viele Anweisungen.

    
Daniel Fischer 23.09.2012 22:45
quelle

Tags und Links