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)
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.
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%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.
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.
Tags und Links c objective-c