[gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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:
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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")


Zuletzt geändert von Mijikai am 02.09.2017 23:08, insgesamt 1-mal geändert.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag 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)
Zuletzt geändert von ccode_new am 02.09.2017 23:11, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Mijikai »

Die Inline Variante ist bei mir mit Debugger ca. 200 ms schneller
und ohne ca. 10 ms schneller.
Antworten