ASM Anfänger bittet um erste Tipps
ASM Anfänger bittet um erste Tipps
Hi Leute,
hab bisher noch nie mit ASM (steht für Assembler, glaub ich) geproggt, hab aber gehört das es sehr viel schneller sein soll als "normaler" Code, oder?
Wollte jetzt fragen ob es sich lohnt einzelne Berechnungen (genauer die Entfernung zwischen zwei Point strukturierten Variablen) damit auszuführen?
Gruß
Scarabol
hab bisher noch nie mit ASM (steht für Assembler, glaub ich) geproggt, hab aber gehört das es sehr viel schneller sein soll als "normaler" Code, oder?
Wollte jetzt fragen ob es sich lohnt einzelne Berechnungen (genauer die Entfernung zwischen zwei Point strukturierten Variablen) damit auszuführen?
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Code: Alles auswählen
Procedure.f Distance(Pos1X, Pos1Y, Pos2X, Pos2Y)
ProcedureReturn Sqr(Pow(Pos1X-Pos2X, 2)+Pow(Pos1Y-Pos2Y, 2))
EndProcedure
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Also mehr als das hier geht wohl nicht:
Code: Alles auswählen
Macro Distance(Pos1X, Pos1Y, Pos2X, Pos2Y)
Sqr(Pow(Pos1X-Pos2X, 2)+Pow(Pos1Y-Pos2Y, 2))
EndMacro
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Ok, danke hab ich geändert.
Wie sieht es den Grundsätzlich mit dieser Art von Berechnungen aus, ASM ja oder nein? Oder wofür wird es am häufigsten verwendet (schreibt bitte nicht "optimieren", genauer!)?
Gruß
Scarabol
Wie sieht es den Grundsätzlich mit dieser Art von Berechnungen aus, ASM ja oder nein? Oder wofür wird es am häufigsten verwendet (schreibt bitte nicht "optimieren", genauer!)?
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea
PB-V: 4
WinXP
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Achja, was man noch machen könnte: Pow() ist soweit ich weiß noch ein CALL, also kannst du das mal durch x = (ax-bx) : y = (ay - by) und dann x * x statt Pow(x, 2) und y * y statt Pow(y, 2) machen, aber dann hast du ein mehrzeiliges Macro oder du machst wieder eine Prozedur draus. Also Grundsätzlich wird der ganze PB Code sowieso in Assembler umgewandelt. Du musst ihn nur ein bisschen von Hand optimieren können (Kompillier mal einen testcode mit "pbcompiler.exe deinePBDatei.pb /COMMENTED" und schau dir PureBasic.asm im Compiler Verzeichnis an).Scarabol hat geschrieben:Ok, danke hab ich geändert.
Wie sieht es den Grundsätzlich mit dieser Art von Berechnungen aus, ASM ja oder nein? Oder wofür wird es am häufigsten verwendet (schreibt bitte nicht "optimieren", genauer!)?
Gruß
Scarabol
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Also ich habe mal ein C-Programm mit Assembler optimiert, und da ging noch einiges. Gerade was Schleifen anging, Calls, und unnötige Wertzuweisungen. Heutzutage sind Compiler natürlich in der Lage, vieles davon selbst zu optimieren, und es kommt auch vor, daß er sogar besseren Code produziert, als wenn man selbst mit Assembler rumfrickelt (vor allem, wenn man noch nicht viel Ahnung davon hat).
In vielen Fällen ist es gar nicht nötig, mit Assembler zu optimieren. Meist liegen die Perfromance-fressenden Probleme nämlich ganz woanders, z.B. im verwendeten Algortihmus, in der Speicherverwaltung oder sonst etwas. Erst wenn man das alles 100%ig ausschließen kann, und das Programm immer noch zu langsam ist, sollte man drüber nachdenken, ob mit Assembler noch was zu machen ist.
Ich weiß jetzt nicht wie es bei Dir aussieht: Willst du einfach nur Assembler lernen, oder hast Du grad ein konkretes Performance-Problem mit Deinen 2 Punkten, wo Du einfach vermutest, daß Assembler die einzige Lösung ist? Falls letzteres zutrifft, wäre es evtl. sinnvoller, wenn Du erstmal Dein Problem und Deine Vorgehensweise schilderst, denn es ist denkbar, daß der wahre Flaschenhals ganz woanders sitzt (und das können echt simple Denkfehler sein).
In vielen Fällen ist es gar nicht nötig, mit Assembler zu optimieren. Meist liegen die Perfromance-fressenden Probleme nämlich ganz woanders, z.B. im verwendeten Algortihmus, in der Speicherverwaltung oder sonst etwas. Erst wenn man das alles 100%ig ausschließen kann, und das Programm immer noch zu langsam ist, sollte man drüber nachdenken, ob mit Assembler noch was zu machen ist.
Ich weiß jetzt nicht wie es bei Dir aussieht: Willst du einfach nur Assembler lernen, oder hast Du grad ein konkretes Performance-Problem mit Deinen 2 Punkten, wo Du einfach vermutest, daß Assembler die einzige Lösung ist? Falls letzteres zutrifft, wäre es evtl. sinnvoller, wenn Du erstmal Dein Problem und Deine Vorgehensweise schilderst, denn es ist denkbar, daß der wahre Flaschenhals ganz woanders sitzt (und das können echt simple Denkfehler sein).


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
falsch, da geht noch der aller wichtigste punkt:DarkDragon hat geschrieben:Also mehr als das hier geht wohl nicht:
Code: Alles auswählen
Macro Distance(Pos1X, Pos1Y, Pos2X, Pos2Y) Sqr(Pow(Pos1X-Pos2X, 2)+Pow(Pos1Y-Pos2Y, 2)) EndMacro
Code: Alles auswählen
DX = Pos1X-Pos2X
DY = Pos1Y-Pos2Y
D2 = DX*DX + DY*DY
;----------
Dist = Sqr(D2)
deswegen besser splitten, und DX*DX verwenden.
2.) wenn man distanzen vergleichen will, kann man sich bei beiden das wurzelziehen sparen.
dann verwendet man gleich D2 zum vergleichen, der rest des algorithmus entfällt.
Bevor man sowas nicht drauf hat, braucht man mit ASM nicht anzufangen.
es ist föllig egal, ob man die Pow() funktion von ASM aus oder von PB aus aufruft,
der Trick ist, sie überhaupt nicht aufzurufen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
es ist föllig egal

Sowas ist mir aber nicht egal



ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Ja lies mal zuerst alles zuende. Mein 2. Post sagt nämlich genau das. Man kann es machen wie man will.Kaeru Gaman hat geschrieben:falsch, da geht noch der aller wichtigste punkt:DarkDragon hat geschrieben:Also mehr als das hier geht wohl nicht:
Code: Alles auswählen
Macro Distance(Pos1X, Pos1Y, Pos2X, Pos2Y) Sqr(Pow(Pos1X-Pos2X, 2)+Pow(Pos1Y-Pos2Y, 2)) EndMacro
...
Nunja, wenn PB intelligent wäre würde es auch Pow als Compiler-Inside-Makro halten und es ersetzen, aber anscheinend tut es das ja nur bei anderen Funktionen....Pow() funktion von ASM aus oder von PB aus aufruft...
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.