416 Stimmen

Welche Option ist besser geeignet, um eine ganze Zahl durch 2 zu dividieren?

Welche der folgenden Techniken ist die beste Möglichkeit, eine ganze Zahl durch 2 zu teilen, und warum?

Technik 1:

x = x >> 1;

Technik 2:

x = x / 2;

Hier x ist eine ganze Zahl.

13voto

James Oravec Punkte 17979

Ich würde sagen, es gibt mehrere Dinge zu beachten.

  1. Bitshift sollte schneller sein, da keine besonderen Berechnungen erforderlich sind. zum Verschieben der Bits erforderlich ist, aber wie bereits erwähnt, gibt es mögliche Probleme mit negativen Zahlen. Wenn Sie sicher sind, dass Sie positive Zahlen haben und auf Geschwindigkeit Wert legen, würde ich bitshift.

  2. T Wenn Sie also Wert auf die Lesbarkeit des Codes legen, können Sie diesen verwenden. Beachten Sie dass die Compiler-Optimierung einen langen Weg zurückgelegt hat, so dass es eine gute Praxis ist, den Code leicht Code leicht zu lesen und zu verstehen ist, ist eine gute Praxis.

  3. D können die Operationen unterschiedlich schnell sein. Das Amdal'sche Gesetz soll den allgemeinen Fall schnell zu machen. Sie können also Hardware haben, die verschiedene Operationen schneller ausführen kann als andere. Zum Beispiel kann die Multiplikation mit 0,5 schneller sein als die Division durch 2. (Zugegeben, Sie müssen möglicherweise die Untergrenze der Multiplikation nehmen, wenn Sie eine ganzzahlige Division erzwingen wollen).

Wenn es Ihnen um reine Leistung geht, würde ich empfehlen, einige Tests zu erstellen, die die Vorgänge millionenfach ausführen können. Führen Sie mehrere Stichproben durch (Ihre Stichprobengröße), um festzustellen, welche Ausführung mit Ihrem Betriebssystem/Hardware/Compiler/Code statistisch gesehen die beste ist.

13voto

tylerl Punkte 29162

Was die CPU betrifft, so sind Bit-Shift-Operationen schneller als Divisionsoperationen. Der Compiler weiß dies jedoch und wird im Rahmen seiner Möglichkeiten entsprechend optimieren, Sie können also so programmieren, wie es am sinnvollsten ist, und sich darauf verlassen, dass Ihr Code effizient läuft. Aber denken Sie daran, dass eine unsigned int kann (in einigen Fällen) besser optimiert werden als eine int aus den bereits erwähnten Gründen. Wenn Sie keine vorzeichenbehaftete Arithmetik benötigen, dann lassen Sie das Vorzeichenbit weg.

13voto

Shashwat Kumar Punkte 5019

Ich erzähle das zum Zwecke der Programmierung von Wettbewerben. Im Allgemeinen haben sie sehr große Eingänge, bei denen die Division durch 2 viele Male stattfindet, und es ist bekannt, dass der Eingang positiv oder negativ ist.

x>>1 wird besser sein als x/2. Ich habe auf ideone.com ein Programm ausgeführt, bei dem mehr als 10^10 Operationen zur Division durch 2 stattfanden. x/2 benötigte fast 5,5s, während x>>1 fast 2,6s für dasselbe Programm benötigte.

12voto

Imdad Punkte 5854

使用方法 x = x / 2; OR x /= 2; Denn es ist möglich, dass in Zukunft ein neuer Programmierer daran arbeitet. So wird es für ihn einfacher sein, herauszufinden, was in der Codezeile vor sich geht. Solche Optimierungen sind vielleicht nicht jedem bekannt.

10voto

Atul Kumar Punkte 423

Machen Sie Ihre Absichten klarer... wenn Sie z.B. dividieren wollen, verwenden Sie x / 2, und lassen Sie den Compiler es auf den Shift-Operator (oder etwas anderes) optimieren.

Bei den heutigen Prozessoren haben diese Optimierungen keinen Einfluss auf die Leistung Ihrer Programme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X