ASM Anfänger bittet um erste Tipps

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

ASM Anfänger bittet um erste Tipps

Beitrag von Scarabol »

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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wie führst du sie denn bisher aus? ;)

poste mal code... :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Code: Alles auswählen

Procedure.f Distance(Pos1X, Pos1Y, Pos2X, Pos2Y)
  ProcedureReturn Sqr(Pow(Pos1X-Pos2X, 2)+Pow(Pos1Y-Pos2Y, 2))
EndProcedure
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

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.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

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
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).
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.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

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).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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
falsch, da geht noch der aller wichtigste punkt:

Code: Alles auswählen

DX = Pos1X-Pos2X
DY = Pos1Y-Pos2Y
D2 = DX*DX + DY*DY
;----------
Dist = Sqr(D2)
1.) die verwendung von Pow() ist extrem langsam.
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.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

es ist föllig egal
:shock:

Sowas ist mir aber nicht egal ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Kaeru Gaman hat geschrieben:
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
falsch, da geht noch der aller wichtigste punkt:

...
Ja lies mal zuerst alles zuende. Mein 2. Post sagt nämlich genau das. Man kann es machen wie man will.
...Pow() funktion von ASM aus oder von PB aus aufruft...
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.
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.
Antworten