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! :mrgreen: :allright:

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 :roll:

Das sind meine ersten Gehversuche mit der FPU :freak:

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 :D

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 :o )

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