Page 2 sur 2
Publié : dim. 05/avr./2009 9:24
par Backup
c'est interressant , je ne savais pas qu'un
simple
mem_a=A impliquai une sauvegarde sur la pile + un depilement
j'aurai naîvement pensé a un truc genre :
Mov dword [v_mem_A],dword [v_A]
ou un truc du genre (ps: mes connaissances en ass date du 68000, et ma memoire est une passoire ...)
Publié : dim. 05/avr./2009 12:27
par tonton
Un truc me faisait tiquer sur vos tests.
en utilisant le registre TSC le code de dobro est plus rapide...
j' y comprend plus rien!!
Edit::: ouff!! non! c' est celui d' Ollivier le plus rapide!! ca doit merdé au niveau du "Requester "
en séparant le code en deux ca marche mieux.
Code : Tout sélectionner
pfa.l
!rdtsc
!push eax
For vv = 0 To 200000
A = 1234
mem_A=A
For A = 0 To 10
Next
A=mem_A
Next vv
!pop eax
!mov ebx,eax
!rdtsc
!sub eax,ebx
!mov [v_pfa],eax
MessageRequester(" Dobro",Str(pfa), #PB_MessageRequester_Ok)
Code : Tout sélectionner
pfa.l
!rdtsc
!push eax
For vv = 0 To 200000
A = 1234
! push [v_A]
For A = 0 To 10
Next
! pop [v_A]
Next vv
!pop eax
!mov ebx,eax
!rdtsc
!sub eax,ebx
!mov [v_pfa],eax
MessageRequester(" Ollivier",Str(pfa), #PB_MessageRequester_Ok)
on trouve a peut pres 4 000 000 cycles horloge de difference
Publié : dim. 05/avr./2009 14:29
par Ollivier
@Tonton
RDTSC, excellent ce machin!!! Merci!
Ollivier
Publié : mer. 17/juin/2009 20:21
par Ollivier
Allez hop... Je ne sais pas si c'est très utile comme ça mais je la poste quand même cette ptite procédure de chrono... Même si le pas est faussé et irrégulier, j'obtiens une valeur en dixième de nanoseconde. Je ne sais pas si c'est la même sur vos ordis...
Code : Tout sélectionner
Procedure.Q ElapsedCycles()
Protected Result.Q
Protected Temp.Q
Protected A.L
Protected B.L
!Rdtsc
!Mov [p.v_A], EAX
!Mov [p.v_B], EDX
Result = B
Result << 32
Temp = A
If Temp => 0
Result | Temp
Else
Temp & $7FFFFFFF
Result | Temp
Result | $80000000
EndIf
ProcedureReturn Result.Q
EndProcedure
Publié : mer. 17/juin/2009 23:11
par PAPIPP
Bonjour a tous
Voici un peu plus rapide
Code : Tout sélectionner
Procedure.q ElapsedCyclep()
!rdtsc
ProcedureReturn
EndProcedure
Procedure.Q ElapsedCycles()
Protected Result.Q
Protected Temp.Q
Protected A.L
Protected B.L
!Rdtsc
!Mov [p.v_A], EAX
!Mov [p.v_B], EDX
Result = B
Result<<32
Temp = A
If Temp = >0
Result | Temp
Else
Temp & $7FFFFFFF
Result | Temp
Result | $80000000
EndIf
ProcedureReturn Result.Q
EndProcedure
nmax=1000
For nb=0 To 10
deps=elapsedcycles()
For i=0 To nmax
dep_=elapsedcycles()
Next
Debug "elapsedcycles="+Str(elapsedcycles()-deps)
depp=elapsedcyclep()
For j=0 To nmax
dep_=elapsedcyclep()
Next
Debug "elapsedcyclep="+Str(elapsedcyclep()-depp)
Next
Cette fonction a déjà été utilisée dans
http://www.purebasic.fr/french/viewtopi ... 2&start=45
Publié : mer. 17/juin/2009 23:54
par Ollivier
@PAPIPP
Ah... Je me suis fait chier pour rien... M'enfin, l'essentiel c'est de le savoir, et le plus tôt c'est le mieux...
Donc, quand on met un Q en sortie de procédure, ProcedureReturn chope EAX en double-mot de poids faible et EDX en double-mot de poids fort.
Ben, merci, c'est simple et explicite!!!
Ollivier
Publié : jeu. 18/juin/2009 7:44
par PAPIPP
Bonjour Ollivier
en effet c'est bien cela voici le prg en PB et en ASM
Code : Tout sélectionner
Procedure.q ElapsedCyclep()
!rdtsc
ProcedureReturn
EndProcedure
dep8.q = elapsedcyclep()
Debug SizeOf(dep8)
Debug dep8
;*************** Voici le même en ASM ********************
; Procedure.q ElapsedCyclep()
; Macro {MP0
; _Procedure0:
; PS0=4
; ; !rdtsc
; RDTSC
; ; ProcedureReturn
; JMP _EndProcedure1
; ; EndProcedure
; XOR eax,eax
; XOR edx,edx
; _EndProcedure1:
; RET
; }
; ; dep8.q = elapsedcyclep()
; CALL _Procedure0
; PUSH edx
; PUSH eax
; POP dword [v_dep8]
; POP dword [v_dep8+4]
; ; Debug SizeOf(dep8)
; ; Debug dep8
; ;
; _PB_EOP_NoValue:
; PUSH dword 0
; _PB_EOP:
; CALL _PB_EndFunctions
; PUSH dword [PB_MemoryBase]
; CALL _HeapDestroy@4
; CALL _ExitProcess@4
; _PB_EndFunctions:
; RET
; ;
A+