Seite 2 von 3
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 21:02
von ccode_new
@Mijikai:
Ja so ist es besser!
So kann man auch unter Linux etwas damit anfangen.
Aber deine ASM-Funktion ist trotzdem langsamer als die "normale" Variante.
Kann man da noch optimieren?
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 21:12
von Mijikai
ccode_new hat geschrieben:...
Kann man da noch optimieren?
Ja, der Code der reinen Purebasic Funktion z.B.
läd den Float Wert direkt ohne ihn umwandeln zu müssen fdiv
ist zudem schneller als fdivp da fdivp den stack manipuliert.
Was noch alles möglich ist kann ich nicht sagen
Das sind meine ersten Gehversuche mit der FPU
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 21:15
von ccode_new
Ach noch etwas:
Ich habe die Procedure "Processed" (Also die "Normale") und die Procedure "ASM_Processed" mal mit ElapsedMilliseconds() und einer laaangen FOR-Schleife getestet.
Dabei sind mir zwei Dinge aufgefallen:
1. Die Proceduren sind "fast" gleich schnell. (Die "normale" ist bei mir nur 1ms schneller als die Assemblervariante)
2. Es kommt bei der Assemblervariante zu einem Bug.
Ich habe mal folgende Beispielwerte getestet:
Code: Alles auswählen
go1 = ElapsedMilliseconds()
For i = 0 To 10000
Debug ASM_Processed(10,20)
Next i
Debug ElapsedMilliseconds() - go1
Ab dem 7. Durchlauf liefert
nur die Assembler-Variante einen Bug.
Hier der Debug:
200
200
200
200
200
200
-9223372036854775808
-9223372036854775808
...und so weiter
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 21:40
von Mijikai
Wahrscheinlich ein Problem mit dem Stack durch 'fld st1'.
Tritt der Fehler auch damit auf?
Code: Alles auswählen
Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
!fild qword[p.v_Bytes]
!mov qword[p.v_Bytes],64h
!fild qword[p.v_Bytes]
!fdivp
;...
!fistp qword[p.v_Bytes]
!mov rax,[p.v_Bytes]
ProcedureReturn
EndProcedure
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 21:57
von ccode_new
Ähm Nö!
So tritt der Fehler nicht auf, aber die "Procedure" liefert aber auch nur "0" als Rückgabewert.
Can you find the error?
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 22:10
von Mijikai
Neue Version
Code: Alles auswählen
Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
!fild qword[p.v_Bytes]
!fdiv dword[_FLT]
!fstp qword[p.v_Bytes]
!fild qword[p.v_BytesProcessed]
!fdiv qword[p.v_Bytes]
!fistp qword[p.v_Bytes]
!mov rax,[p.v_Bytes]
ProcedureReturn
!_FLT:
!dd 42C80000h
EndProcedure
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 22:17
von ccode_new
Cool!
So funktioniert die Prozedur.
Aber die Funktion ist trotzdem bei mir noch 1 bis 3 ms langsamer als die "normale" Variante.
Mmmh, eigentlich sind beide Varianten eben fast gleich schnell. (Manchmal sogar gleich schnell im ms-Bereich)
Also müsste die "Procedure" noch weiter optimiert werden.
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 22:47
von Mijikai
Bei mir ist die Inline Variante schneller.
Testcode:
Code: Alles auswählen
Procedure.i Processed(Bytes.i,BytesProccessed)
Protected Factor.f = Bytes / 100
ProcedureReturn BytesProccessed / Factor
EndProcedure
Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
!fild qword[p.v_Bytes]
!fdiv dword[_FLT]
!fstp qword[p.v_Bytes]
!fild qword[p.v_BytesProcessed]
!fdiv qword[p.v_Bytes]
!fistp qword[p.v_Bytes]
!mov rax,[p.v_Bytes]
ProcedureReturn
!_FLT:
!dd 42C80000h
EndProcedure
sequence = 10000000
start1 = ElapsedMilliseconds()
For t = 1 To sequence
ASM_Processed(500,33)
Next
end1 = ElapsedMilliseconds() - start1
start2 = ElapsedMilliseconds()
For t = 1 To sequence
Processed(500,33)
Next
end2 = ElapsedMilliseconds() - start2
MessageRequester("Ergebnis","Inline: " + StrF(end1) +" ms" + Chr(13) + "PureBasic: " + StrF(end2) +" ms")
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 23:02
von ccode_new
Mmmh ich revidiere meine Aussage.
Die Inline-Variante ist doch "etwas" schneller.
Wie groß ist die Differenz bei dir ?
Bei mir max. 300 ms. (Debugger) (Inline is the winner
)
->max. 7 ms (ohne Debugger) (nach 20 Versuchen)
Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)
Verfasst: 02.09.2017 23:07
von Mijikai
Die Inline Variante ist bei mir mit Debugger ca. 200 ms schneller
und ohne ca. 10 ms schneller.