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?
Ja, der Code der reinen Purebasic Funktion z.B.ccode_new hat geschrieben:...
Kann man da noch optimieren?
Code: Alles auswählen
go1 = ElapsedMilliseconds()
For i = 0 To 10000
Debug ASM_Processed(10,20)
Next i
Debug ElapsedMilliseconds() - go1
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
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
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")