Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
31.01.2002, 00:40




(none)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
31.01.2002, 07:04
Tron



x = w % 8
weisst x den rest der division von w durch 8 zu (bsp: 22 / 8 == 2; 22 % 8 == 6)
nun ist 8 eine 2er-potenz (pow(2,3) == 8), also entspraeche der division durch 8 genau das bitweise verschieben nach rechts um 3 bit, genau diese 3 bit die 'rausgeschoben' werden bilden den rest.
x = w & 7
macht nichts anderes als alle bits bis auf die unteren 3 (4 + 2 + 1 == 7) mithilfe des bitweisen 'und' auszublenden

man kann generell sagen: w % pow(2, n) == w & (pow(2, n) - 1)

fazit: unnoetig, da ein heutiger compiler diese optimierung selbst vornimmt.

z = y * 33
klar: y mal 33 und in z reinschieben
z = (y << 5) + y
heisst y um 5 bit nach links schieben (was einer multiplikation mit 32 == pow(2, 5) entspricht) und noch einmal y addieren (32 + 1 == 33)

fazit: koennte schon eher was bringen, fuehrt aber eventuell zu einem stall, was den nutzen stark mindert, ausserdem schlecht lesbar

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
002
31.01.2002, 14:08
Prefect



Also, % / * mit 2er-Potenzen durch Bitoperationen zu ersetzen macht in der Tat Sinn, aber die Compiler optimieren das selber.

Multiplikationen mit Konstanten _kann_ man so umschreiben, aber es bringt auf modernen Prozessoren _nichts_, da sie auch Multiplikationen in einem (?) Schritt machen können, und eher Probleme mit der RAM-Bandbreite haben (und mehrere Shifts hintereinander vergrößern den Code drastisch).
Bei früheren Prozessoren hat das Sinn gemacht, aber auch das hat mein Compiler damals selber erkannt.

Ergo: Man sollte den Code so schreiben, daß er am leichtesten lesbar ist bzw. am meisten Sinn bringt. Optimierungen auf dieser Ebene machen bei heutigen Compilern in der Regel keinen Sinn mehr.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
003
31.01.2002, 15:54
Mazze



Multiplikationen in einem Schritt?
Glaub ich weniger:

Wert aus dem Speicher hohlen
Multiplizieren
Wert in den Speicher schreiben

Oder wie wollen das denn moderne CPUs machen?

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
004
31.01.2002, 16:22
Tron



@Mazze:
schonmal was von pipeline-verfahren gehoert? waehrend der eine befehl ausgefuehrt wird, koennen fuer den nachsten schonmal die parameter gelesen werden

also:
Quellcode:
Decode..1 2 3 4
Fetch.....1 2 3
Execute.....1 2
Write.........1

wobei jede ziffer einen befehl darstellt

@Prefect:
imho kann mul nicht in einem takt erledigt werden, ist aber trotzdem schneller als ein shift und ein add

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 31.01.2002 um 16:25 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
31.01.2002, 17:23
mani



lol, also bei ~8GHz system macht das wohl selbst bei enorm großen code ( so 5-10 Mio. Zeilen) keinen allzugroßen sinn...(würd ich ma sagen) und die lesbarkeit fördert es wahrlicht nicht....
btw: was macht pow() ?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
31.01.2002, 17:26
Archangel



pow(x, y) -> x ^ y

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
007
31.01.2002, 18:01
Tron



@Archangel:
arg... ne!
pow(x, y) ist x 'hoch' y
x ^ y ist x XOR y

@Mani:
wenn der code etwa 10mio mal pro sekunde aufgerufen wird MACHT das einen unterschied, auch bei einem 8ghz rechner

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
008
31.01.2002, 18:11
Archangel



arrr, ich meinte doch hoch, aber hoch zu schreiben sieht einfach scheisse aus.. ich hab mir einfach mal die freiheit genommen, den ^ operator zu überladen ;)

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
009
31.01.2002, 18:27
mani



tron: wird er aber nicht :p

--

zum Seitenanfang zum Seitenende Profil || Suche
010
31.01.2002, 18:37
apfelkorn



naaberhossa... da hat sich wohl eine schöne schwäche dann bei c eingeschlichen... "^" ist die internationale offizielle umschreibung für "hoch"

--

zum Seitenanfang zum Seitenende Profil || Suche
011
01.02.2002, 15:05
Prefect



Klar, optimieren sollte man immer, allerdings sollte die Optimierung nicht auf Kosten der Lesbarkeit des Codes gehen - außer vielleicht in kurzen (~ 10 Zeilen) Inner-Loops die an die Mio. mal pro Sekunde aufgerufen werden...

Und auch dann sollte man schauen, ob die Optimierung wirklich besseren (Assembler-)Code liefert...
Wie gesagt, x % 8 als x & 7 umzuschreiben macht für die meisten Compiler gar keinen Unterschied, da sie diesen Fall sowieso optimieren.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche