Ich würde gerne wissen, ob eine logische Verschiebung nach rechts schneller ist, wenn um eine Potenz von 2 verschoben wird. Ich benutze C ++.
Zum Beispiel ist
%Vor%ist schneller als
%Vor%Ich schätze, dass die erste Antwort für alle darin besteht, mir zu sagen, dass man sich nicht um winzige Kleinigkeiten wie diese kümmern sollte, sondern um korrekte Algorithmen und Sammlungen, um Größenordnungen zu reduzieren. Ich stimme dir vollkommen zu, aber ich versuche wirklich, alles aus einem Embedded-Chip herauszuquetschen (ein ATMega328) - ich habe nur eine Leistungsveränderung, die einem "Woohoo!" Würdig ist! indem ich einen Teil durch einen Bit-Shift ersetze, verspreche ich dir, dass das wichtig ist.
Danke.
Schauen wir uns das Datenblatt an:
Soweit ich sehen kann, verschiebt sich die ASR (rechnerische Verschiebung nach rechts) immer um ein Bit und kann nicht die Anzahl der Bits zum Verschieben nehmen; Es dauert einen Zyklus zur Ausführung. Daher wird die Verschiebung um n Bits n Zyklen dauern. Zweierpotenzen verhalten sich genauso wie jede andere Zahl.
In der AVR-Befehlssatz , arithmetische Verschiebung nach rechts und links passieren ein Bit zu einem Zeitpunkt . Für diesen speziellen Mikrocontroller bedeutet das Verschieben von >> n
, dass der Compiler tatsächlich viele einzelne asr
ops macht, und ich denke, >>3
ist eins schneller als >>4
.
Das macht den AVR übrigens ziemlich unsinnig.
Sie müssen die Dokumentation Ihres Prozessors für diese Information konsultieren. Selbst für einen gegebenen Befehlssatz können je nach Modell unterschiedliche Kosten anfallen. Auf einem wirklich kleinen Prozessor könnte die Verschiebung um eins möglicherweise schneller sein als bei anderen Werten (zum Beispiel bei Rotationsanweisungen auf einigen IA32-Prozessoren, aber nur deshalb, weil diese Anweisung so selten von Compilern erzeugt wird).
> Laut Ссылка werden alle logischen Verschiebungen in einem Zyklus für den ATMega328 durchgeführt. Aber natürlich, wie in den Kommentaren erwähnt, sind alle logischen Verschiebungen um ein Bit. Die Kosten einer Verschiebung um n
sind also n
Zyklen in n
Anweisungen.
Es hängt davon ab, wie der Prozessor aufgebaut ist. Wenn der Prozessor eine Laufrotation hat, kann er eine beliebige Anzahl von Bits in einer Operation verschieben, aber das kostet Platz und Energiebudget. Die wirtschaftlichste Hardware könnte nur um eins rotieren, mit Optionen bezüglich des Wrap-Around-Bits. Als nächstes wäre einer, der sich entweder nach links oder nach rechts drehen könnte. Ich kann mir eine Struktur vorstellen, die einen 1-Shifter, 2-Shifter, 4-Shifter usw. hat. In diesem Fall ist 4 vielleicht schneller als 3.
Wenn Ihr Targe-Prozessor einen Bit-Shift-Befehl hat (was sehr wahrscheinlich ist), dann hängt es von der Hardware-Implementierung dieses Befehls ab, ob es irgendeinen Unterschied zwischen dem Verschieben von 2-Bit-Bits oder dem Verschieben von einigen gibt andere Nummer. Es ist jedoch unwahrscheinlich, dass es einen Unterschied macht.
Zerlegen Sie zuerst den Code. Lassen Sie sich nicht von Leuten abschrecken, die Ihnen sagen, Sie verschwenden Ihre Zeit. Das Wissen, das du gewinnst, wird dich in die Lage versetzen, die Person zu werden, die die großen Firmenfeuer löscht. Die Zahl der Menschen mit echten hinter dem Vorhang Wissen fällt in dieser Industrie mit einer alarmierenden Rate.
Hört sich an, als ob andere hier die wirkliche Antwort erklärt hätten, welche Disassemblierung hätte gezeigt werden müssen. Also werden 4 Schichten 133% der Zeit beanspruchen, die 3 Schichten benötigt haben, oder 3 Schichten sind 75% der Zeit von 4 Schichten, abhängig davon, wie Sie die Zahlen verglichen haben. Und Ihre Messungen sollten diesen Unterschied widerspiegeln, wenn sie nicht mit diesem Experiment fortfahren, bis Sie die Ausführungszeiten vollständig verstehen.
Tatsächlich hat ATMega einen Swap-Nibble-Befehl. Daher kann die Verschiebung x << 4
schneller als x << 3
x << 3
wird durch 3 Linksverschiebungen implementiert
wobei x << 4
nur einen Swap und ein bisschen clear
oder
%Vor%oder wenn Sie sicherstellen können, dass die oberen 4 Bits Null sind, genügt ein Nibble Swap
%Vor%Tags und Links optimization c++ bit-manipulation bit shift