 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 30.08.2013, 09:41 Titel: |
|
|
wie schon von mir gefragt: wieso sortierst du nicht das array komplett?
dann hast du doch was du brauchst?!
rang1 = index1, rang 2 = index2, rang3 = index3 usw.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 30.08.2013, 10:00 Titel: |
|
|
Ich verstehe nicht warum du so einen Aufwand machst. Wie ThePuppetMaster es sagte, benutze doch einfach Pointer. Es gibt einen kleinen Unterschied. Bei meiner Sortierung wird bei gleichen zahlen nicht der gleiche rang vergeben, sondern das erste obj im ausgangs array hat immer den höheren rang, bzw. wenn merhere Elemente die gleiche Zahl haben würden diese mehre ränge bekommen, nach Ausgangsposition.
Code: |
Randomize Timer
Type Tobj
zahl As Integer
zahl_temp As Integer
rang As Integer
End Type
' --- Deine Version --
Sub Sort1(obj() As Tobj, counter As Integer)
Dim _timer As Single
Dim counts As Integer
counts = 0
_timer = Timer
Do
Dim tpos As Integer
Do
If tpos = counter Then Exit Do
If obj(tpos).zahl_temp > obj(tpos + 1).zahl_temp Then
Swap obj(tpos).zahl_temp, obj(tpos + 1).zahl_temp
If tpos > 0 Then tpos -= 1
Else
tpos += 1
EndIf
Loop
For i As Integer = 0 To counter
For ii As Integer = 0 To counter
If obj(i).zahl = obj(ii).zahl_temp Then
obj(i).rang = ii
EndIf
Next
Next
counts += 1
Loop Until (Timer > _timer + 1)
Print counts
End Sub
' --- Meine Version mit Pointer Array --
Sub Sort2(obj() As Tobj, pobj() As Tobj Ptr,counter As Integer)
Dim _timer As Single
Dim counts As Integer
counts = 0
_timer = Timer
Do
Dim tpos As Integer
Do
If tpos = counter Then Exit Do
If pobj(tpos)->zahl > pobj(tpos + 1)->zahl Then
Swap pobj(tpos), pobj(tpos + 1)
If tpos > 0 Then tpos -= 1
Else
tpos += 1
EndIf
Loop
For i As Integer = 0 To counter
pobj(i)->rang = i
Next
counts += 1
Loop Until (Timer > _timer + 1)
Print counts
End Sub
' Hauptptogramm
Dim counter As Integer = 30
Dim obj(counter) As Tobj
Dim obj2(counter) As Tobj
Dim pobj2(counter) As Tobj ptr
Dim _timer As Single
_timer = Timer
Dim counts As Integer
Do
counts += 1
Loop Until (Timer > _timer + 1)
Print counts
counts = 0
_timer = Timer
'Generiere Zufällige Wert
For i As Integer = 0 To counter
obj(i).zahl = Int(Rnd * 100)
obj(i).zahl_temp = obj(i).zahl
obj2(i).zahl = obj(i).zahl
obj2(i).zahl_temp = obj(i).zahl
pobj2(i) = @(obj2(i))
Next
Print "Deine Sortierung:";
Sort1 obj(),counter
Print "Meine Sortierung:";
Sort2 obj2(),pobj2(),counter
Sleep
'Vergleiche beide Versionen
Print "Vergleiche:"
For i As Integer = 0 To counter
Print obj(i).zahl;obj(i).rang,
Print obj2(i).zahl;obj2(i).rang
Next
sleep
'Mein Array sortiert ausgeben
Print
Print "Mein Array sortiert ausgeben"
For i As Integer = 0 To counter
Print pobj2(i)->zahl; pobj2(i)->rang
Next
Sleep
|
Zuletzt bearbeitet von RockTheSchock am 30.08.2013, 12:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 30.08.2013, 11:55 Titel: |
|
|
Das mit den Pointern sieht auch gut aus!
Nur das die normale z_var ja nicht immer umsortiert werden darf da sonnst ja die obj die ich ausgebe umherzucken da sie immer mit der sortierten z arbeiten. z_soll ja nicht geändert werden ich brauch nur den index...
Glaub bin zu blöd  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 30.08.2013, 12:04 Titel: |
|
|
Warum willst du das Array selbst nicht umsortieren?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 30.08.2013, 12:15 Titel: Genauere Infos |
|
|
@0oFreako0:
Wenn du uns etwas mehr Infos zukommen lässt, was diese Objekte genau machen sollen, wäre es auch einfacher dir genaue Antworten zu geben
In welchem Kontext stehen diese Objekte. Sind es Art Fenster/Ebenen mit unterschiedlicher Größe, die Übereinander dargestellt werden sollen? Is es ein Z-Buffer für 3d objekte im Raum, um nicht sichbare / überlagerte Objekte vom Rendern auszuschließen?
In welchem Kontext brauchst du die Z-Liste der Objekte. Was sind das für Objekte? Über wie viele Objekte reden wir hier? Wie viele Objekte pro sekunde sollen verändert werden? |
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 03.09.2013, 09:15 Titel: |
|
|
Habs hinbekommen war nur zu blöd die anderen koordinaten von den objekten mit an die verschobene stelle im array mit zu verschieben. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 03.09.2013, 09:18 Titel: |
|
|
Meine Frage an die ASM experten
Code: |
Type Tpunkt
x As Integer
y As Integer
End Type
Dim punkt(2) As Tpunkt
Asm
End Asm
For i As Integer = 0 To 2
Print punkt(i).x
Print punkt(i).y
Next
Sleep
End
|
Wie kann ich die weiteren arrays ansteuern in asm um so sachen dort in asm zu verändern?
Bei einem UDT Objekt kann man ja mit zb:
mov esi, [punkt]
mov eax,10
mov [esi], eax
mov esi, [punkt+4]
mov [esi], eax
jeweilt x und y mit einem Wert belegen.
Doch wie steuer ich das in einen mehrfach Array an? |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 03.09.2013, 10:28 Titel: |
|
|
Code: | Type Tpunkt
x As Integer
y As Integer
End Type
Dim punkt(2) As Tpunkt
Dim As Integer b = SizeOf(Tpunkt)
Asm
mov eax, 10
mov ecx, 20
mov [punkt], eax 'punkt(0).x
mov [punkt+4], ecx 'punkt(0).y
mov ebx, [b]
mov [punkt+ebx], eax 'punkt(1).x
mov [punkt+ebx+4], ecx'punkt(1).y
Add ebx, [b]
mov [punkt+ebx], eax 'punkt(2).x
mov [punkt+ebx+4], ecx'punkt(2).y
End Asm
For i As Integer = 0 To 2
Print punkt(i).x
Print punkt(i).y
Next
Sleep
|
oder
Code: | Type Tpunkt
x As Integer
y As Integer
End Type
Dim punkt(2) As Tpunkt
Dim As Integer b = SizeOf(Tpunkt)
Asm
mov eax, 10
mov ecx, 20
lea esi, [punkt]
mov [esi], eax 'punkt(0).x
mov [esi+4], ecx 'punkt(0).y
Add esi, [b]
mov [esi], eax 'punkt(1).x
mov [esi+4], ecx 'punkt(1).y
Add esi, [b]
mov [esi], eax 'punkt(2).x
mov [esi+4], ecx 'punkt(2).y
End Asm
For i As Integer = 0 To 2
Print punkt(i).x
Print punkt(i).y
Next
Sleep
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 04.09.2013, 11:29 Titel: |
|
|
Danke Volta
Kurze Frage noch, wenn ich ein mehrfach verschachteltes array in asm ansteuern will wie mache ich das dann?
hier mein code:
Code: |
Dim _test(0,1) As p
Dim b As Integer = SizeOf(p)
Asm
mov eax, 10
mov ecx, 20
lea esi,[_test]
mov [esi],eax
mov [esi+4],ecx
End asm
'test(0,0).x = 10
'test(0,0).y = 20
Print _test(0,0).x
Print _test(0,1).y
|
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 04.09.2013, 16:55 Titel: |
|
|
Code: | Type p
x As Integer
y As Integer
End Type
Dim _test(2,1) As p
Dim b As Integer = SizeOf(p)
Asm
mov eax, 10
mov ecx, 0
lea esi,[_test]
mov [esi],eax '_test(0,0).x
mov [esi+4],ecx '_test(0,0).y
Add esi, [b]
inc ecx
mov [esi],eax '_test(0,1).x
mov [esi+4],ecx '_test(0,1).y
Add esi, [b]
inc ecx
mov [esi],eax '_test(1,0).x
mov [esi+4],ecx '_test(1,0).y
Add esi, [b]
inc ecx
mov [esi],eax '_test(1,1).x
mov [esi+4],ecx '_test(1,1).y
Add esi, [b]
inc ecx
mov [esi],eax '_test(2,0).x
mov [esi+4],ecx '_test(2,0).y
Add esi, [b]
inc ecx
mov [esi],eax '_test(2,1).x
mov [esi+4],ecx '_test(2,1).y
End Asm
For i As Integer = 0 To 2
Print _test(i,0).x, _test(i,0).y, _test(i,1).x, _test(i,1).y
Next
Sleep | das ist aber weder schneller noch einfacher als
Code: | _test(0,0).x =10
_test(0,0).y =0
_test(0,1).x =10
_test(0,1).y =1
... |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 04.09.2013, 17:22 Titel: |
|
|
Lass das Optimieren sein, bist du mit der Software fertig bist und sie stabil läuft.
Normalerweise kannst du durch Assembler Optimierung die Ausführunggeschwindigkeit maximal vervierfachen bis verachtfachen. Das liegt daran, dass das Rechnen in Registern optimiert werden kann, dadurch dass statt 1x32 Bit Berechnung pro Takt z.b. 4x32 Bit genutzt werden. Das ist abhängig vom Prozessor. Spezifische Prozessoren kann man sicher auch noch viel mehr optimieren, aber dieser Code würde dann z.B. auf einem älteren Prozessor nicht mehr laufen oder auf einem anderen langsamer laufen.
Das wird erreicht indem man SSE Befehle mit größeren Registern nutzt oder aber, indem man mehrere Speicherzellen und Register, die nicht von einander direkt abhängen in den Berechnungen verwendet, sodass moderne Prozessoren automatisch mehrere Berechnungen parallel durchführen. Entscheidend dabei ist dann die richtige Reihenfolge der Befehle, sodass der Prozessor nicht seine interne Verarbeitung unterbrechen muss, um auf eine Berechnung oder einen Speicherzugriff zu warten. http://de.wikipedia.org/wiki/Pipeline_%28Prozessor%29
Auf modernen Mehrkernprozessoren ist es meist besser die Berechnungen auf mehrere Threads zu verteilen, statt alles auf einen Thread zu optimieren.
Du könntest versuchen den "-gen gcc" und "-O" Switch von fbc verwenden.
Ein guter Compiler ist in jedem Fall besser als ein Amateur-Programmierer.
Letztlich ist das Optimieren durch schnelleren Code der allerletzte Schritt in einer Anwendung. Oft ist es viel effektiver am Algorithmus Verbesserungen zu machen. Das bringt oft das 10 bis 100 fache an Geschwindigkeit.
Jede Berechnung die nicht durchgeführt werden muss, ist letzlich schneller als eine, die sehr schnell durchgeführt wird. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 05.09.2013, 10:44 Titel: |
|
|
Ok also hätte ich kaum Vorzüge wenn ich arrays in asm ansprechen würde ?
Da ich ja viel im Pixel Bereich code finde ich aber wenn ich Pixel mit asm auf dem screen ausgebe schneller als mit pset. Wo lohnt es sich den im Bereich Gfx coding noch asm einzusetzen?
Ich weiss opengl ist dafür besser ausgelegt fürs gfxing nur ich bin halt nen Oldschool fan. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.09.2013, 12:59 Titel: |
|
|
PSET ist eine verhältnismäßig langsame Funktion (liegt meines Wissens an den diversen Prüfungen, die durchgeführt werden, um nicht auf falsche Datenbereiche zuzugreifen). Da ist ein direkter Speicherzugriff schneller, aber natürlich auch fehleranfälliger. Ob der direkte Speicherzugriff über ASM allerdings wesentlich schneller ist als der direkte Speicherzugriff über FB-eigene Berechnung, weiß ich nicht; ich denke nicht, dass da der Unterschied übermäßig groß ist. Was Berechnungen angeht, optimiert der Compiler schon ziemlich gut; wichtiger ist, wie RockTheSchock schon sagte, die Berechnungsalgorithmen selbst dahingehend zu optimieren, dass keine überflüssigen Berechnungen stattfinden, also z. B. dass Werte, die eigentlich schon bekannt sind, nicht immer wieder neu berechnet werden.
Äh, ja ... was ich mit diesem Posting eigentlich sagen wollte: du kannst den Geschwindigkeitsgewinn bei PSET nicht vergleichen mit dem Geschwindigkeitsgewinn bei Variablen- oder Speicherzugriffen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|