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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

11

29.01.2008, 17:33

Zitat von »"David Scherfgen"«

Mit ein paar anderen Tricks kann man auch Divisionen durch beliebige (vorher bekannte) Zahlen hinkriegen, ohne wirklich eine Division zu machen Smile


Wie aufwendig ist das? - Habe es mal probiert, bin aber so auf die
schnelle nicht drauf gekommen, wie das geht... :roll:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

29.01.2008, 17:53

Zitat von »"drakon"«

Zitat von »"David Scherfgen"«

Mit ein paar anderen Tricks kann man auch Divisionen durch beliebige (vorher bekannte) Zahlen hinkriegen, ohne wirklich eine Division zu machen Smile


Wie aufwendig ist das? - Habe es mal probiert, bin aber so auf die
schnelle nicht drauf gekommen, wie das geht... :roll:


wie bereits bemerkt: das macht dein compiler für dich ;)

und der kann meistens besser entscheiden ob und wann eine derartige optimierung möglich, sinnvoll und angebracht ist oder nicht...

wenn es dich interessiert, ich habs mal ausprobiert (mit MSVC):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main()
{
  int x = 0;

  std::cin >> x;

  return x / 3;
}


das return x / 3; wurde zu:

Quellcode

1
2
3
4
5
6
    mov ecx, DWORD PTR _x$[esp+4]
    mov eax, 1431655766             ; 55555556H
    imul    ecx
    mov eax, edx
    shr eax, 31                 ; 0000001fH
    add eax, edx

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

29.01.2008, 17:53

Zum Beispiel eine Division durch 10:

x / 10
= x * 1/10
= x * 3276.8 / 32768
~= x * 3277 / 32768
= x * 3277 / 2^15
= (x * 3277) >> 15

Das klappt für alle x < 16389.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

29.01.2008, 18:05

Ok, is ein interessantes Thema. Aber in echtem Code würd ich ein

C-/C++-Quelltext

1
x / 10;


Immer noch einem

C-/C++-Quelltext

1
(x * 3277) >> 15;


vorziehen. Vor allem wenn man bedenkt, dass der Compiler derartige Optimierungen selber verwendet (ja, er tut das wirklich)... ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

29.01.2008, 18:10

Macht das wirklich *jeder* Compiler?
Zudem geht es hier ja mehr darum, wie man sowas anstellen kann. Das ist doch ein interessantes Thema. Und wenn man selber mal Assembler-Code schreiben darf, dann ist es sehr hilfreich sowas zu wissen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

29.01.2008, 18:56

Zitat von »"David Scherfgen"«

Macht das wirklich *jeder* Compiler?
Zudem geht es hier ja mehr darum, wie man sowas anstellen kann. Das ist doch ein interessantes Thema. Und wenn man selber mal Assembler-Code schreiben darf, dann ist es sehr hilfreich sowas zu wissen.


Hehe, klar und das will ich auch nicht bestreiten. Ich wollte nur verhindern dass jetzt jeder der das hier liest denkt, dass er sein Programm optimieren kann indem er auf Divisionsoperatoren verzichtet ;)

EDIT: Ob das jeder Compiler macht, kann ich nicht beantworten. Ich weis nur sicher, dass es MSVC macht. Da es sich dabei um wirklich einfache Optimerungen handelt, würd es mich wundern, wenn einer der "Konkurrenten" (wenn man das mal so sagen darf *duck*; GCC, Intel C/C++ Compiler, Digital Mars, Comeau, Borland, ...) nicht machen würd.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

29.01.2008, 19:05

Zitat von »"dot"«

Zitat von »"David Scherfgen"«

Macht das wirklich *jeder* Compiler?
Zudem geht es hier ja mehr darum, wie man sowas anstellen kann. Das ist doch ein interessantes Thema. Und wenn man selber mal Assembler-Code schreiben darf, dann ist es sehr hilfreich sowas zu wissen.


Hehe, klar und das will ich auch nicht bestreiten. Ich wollte nur verhindern dass jetzt jeder der das hier liest denkt, dass er sein Programm optimieren kann indem er auf Divisionsoperatoren verzichtet ;)


Das stimmt so nicht ganz. Bei Divisionen von Fließkommazahlen kann man deutlich an Geschwindigkeit gewinnen wenn man statt zu dividieren, multipliziert! :p
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

29.01.2008, 19:30

Ok, danke.

In der Tat war mein Ansatz auch irgendwie mit dem * ../.., aber habe es nicht ganz zu Ende gedacht.
Eigentlich ganz logisch... ;-)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

29.01.2008, 19:51

Zitat von »"David_pb"«

Das stimmt so nicht ganz. Bei Divisionen von Fließkommazahlen kann man deutlich an Geschwindigkeit gewinnen wenn man statt zu dividieren, multipliziert! :p


Ja, aber es ging hier nicht um Fließkomma... :p

20

29.01.2008, 21:12

Sehr wichtig sind diese Operatoren natürlich auch auf Microprozessoren zB um die Ports (Ein- und Ausgänge) zu setzen.

z.B. sieht das dann so aus:

C-/C++-Quelltext

1
2
3
4
void setPress(bool stat){
  if (stat) PORTB |= (1<<PB2);
  else PORTB &= ~(1<<PB2);
}

Werbeanzeige