Page 2 sur 2

Publié : dim. 05/avr./2009 9:24
par Backup

Code : Tout sélectionner

PUSH    dword [v_A]        /   mem_A=A   
   POP    dword [v_mem_A]

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!! :lol:

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+