Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

06.08.2012, 21:27

Frage / vs. >>

Entspricht /2 >>1, da ja theoretisch jeder Bit eins nach rechts geht (/2) und dadurch der Wert der Zahl halbiert wird? Weil dann wäre /4 ja >>2 und das wäre >> schneller als /.

mfg

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

06.08.2012, 21:34

Theoretisch hast du recht, praktisch optimieren aktuelle Compiler divisionen durch Zweierpotenzen, falls möglich, ohnehin.
@D13_Dreinig

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

06.08.2012, 21:46

Aber allein den Funktionsaufruf kann man ja einsparen :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

06.08.2012, 21:51

Was für ein Funktionsaufruf? Der MSVC optimiert das sogar im Debugbuild, ohne Zutun:

C-/C++-Quelltext

1
2
3
4
  i = i / 2;
00EB9027  mov         eax,dword ptr [i]  
00EB902A  shr         eax,1  
00EB902C  mov         dword ptr [i],eax
@D13_Dreinig

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

06.08.2012, 21:54

ich kann zwar kein Assembler (find kein gescheites Tut was mit Win7 passt), aber interpretier ich das richtig?
Aus dem Register eax wird der Inhalt in dword ptr gespeichert um 1 nach rechts geshiftet und dann zurückkopiert?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

06.08.2012, 21:55

aber interpretier ich das richtig?
Aus dem Register eax wird der Inhalt in dword ptr gespeichert um 1 nach rechts geshiftet und dann zurückkopiert?


Genau, das Selbe wie i >>= 1 quasi.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

06.08.2012, 22:40

Auch wenn du rein mathematisch gesehen recht hast, so ist / 2 ist in C++ streng genommen nicht das gleiche wie >> 1.
Einfaches Beispiel: Der Ausdruck (-2 / 2) ist wohldefiniert und liefert -1, während (-2 >> 1) dagegen undefiniert ist.
Wenn du Dividieren willst, dann schreib das auch so hin und überlass solche Optimierungen im Allgemeinen lieber dem Compiler. Sowas per Hand zu machen, führt nur zu schwer verständlichem Code voller unnötiger versteckter Bugs, der am Ende sogar wohl eher noch langsamer ist...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (06.08.2012, 22:49)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

06.08.2012, 22:50

Was dot schreibt, stimmt natürlich.
Aber manchmal kann der Compiler nicht wissen, dass du durch eine Zweierpotenz dividierst, und kann es auch nicht optimieren.
Das gilt auch für Modulo, das kann man mit einem bitweisen "und" lösen.
Wenn du also weißt, dass du durch eine Zweierpotenz dividierst bzw. damit modulo rechnest, aber der Wert steht in einer Variablen drin, dann speichere stattdessen den log2 davon bzw. eine entsprechende Bitmaske. Und dann rechnest du mit Bit-Shift bzw. bitweisem "und". Hier bringt es wirklich was, denn du hast mehr Informationen als der Compiler, und er darf gar nicht optimieren.
Aber das Ganze lohnt sich nur in Code, der wirklich extrem oft ausgeführt wird, z.B. wenn du einen eigenen Renderer schreibst :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

06.08.2012, 22:58

...

Ja, in solchen Fällen muss man sich dann natürlich selbst drum kümmern.

SirP

Frischling

Beiträge: 6

Wohnort: Hamburg

  • Private Nachricht senden

10

07.08.2012, 13:57

Man kann so eine Operation auch aufteilen um zum Beispiel eine Multiplikation zu umgehen.
Statt:
i = i * 320
kannst du auch schreiben
i = (i << 6) + (i << 4)
Früher zu MS-DOS-Zeiten(Für die Jüngeren hier: MS-DOS war vor Windows) hat man das gerne verwendet, da eine Addition wesentlich weniger Rechenaufwand für die cpu bedeutete.
Ob das heute aber immernoch so ist, würde ich jetzt nicht meine Hand für ins Feuer legen...

Werbeanzeige