Page 1 sur 2

petit test

Publié : mar. 13/avr./2004 16:49
par cederavic
voilas, c'etait juste pour voir lequel etait le plus rapide et je suis vachement etoné!
le code :

Code : Tout sélectionner

t=GetTickCount_()
For h.l = 0 To 100000*1000 : Next
j = GetTickCount_() - t : Debug j : MessageRequester("", "for next = " + Str(j) + "ms", 0)
h=0 : t=GetTickCount_()
While h <= 100000*1000 : h+1 : Wend
j = GetTickCount_() - t : Debug j : MessageRequester("", "while wend & pb = " + Str(j) + "ms", 0)
h=0 : t=GetTickCount_()
While h <= 100000*1000 : INC h : Wend
j = GetTickCount_() - t : Debug j : MessageRequester("", "while wend & asm = " + Str(j) + "ms", 0)
en compilant j'obtient :
for next = 3203ms
while wend & pb = 6109ms
while wend & asm = 6109ms (pareil que l'autre)
et avec l'exe j'obtient :
for next = 359ms
while wend & pb = 578ms
while wend & asm = 396ms

et vous?

Publié : mar. 13/avr./2004 17:07
par Chris
1172 pour la première
2247 pour la deuxième

la troisième ne fonctionne pas,
---------------------------
jaPBe - Erreur du compilateur !
---------------------------
Line 11: 'H' is not a valid operator
---------------------------
OK
---------------------------
Chris :)

Publié : mar. 13/avr./2004 17:32
par cederavic
j'ai oublier de precisier, il faut activer l'asm inline! (je sais pa comment on fait avec japbe, j'utilise l'editeur d'origine moi)
mais sa confirme qd meme, maintenant je svais essayer d'utiliser for next au lieu des autre boucle (qd c'est possible)

Publié : mar. 13/avr./2004 17:35
par Chris
Ah bon ! Fallait le dire :lol:

2219 pour la 1
4265 pour la 2
4203 pour la 3

Chris :)

Publié : mar. 13/avr./2004 18:16
par Paneric
sous Pure editeur:

test 1 = 1750 ms
test 2 = 3328 ms
test 3 = 3344 ms

avec l'exe

test 1 = 219 ms
test 2 = 297 ms
test 3 = 219 ms

Cpu athlon 2400 xp+

Il semble que le test1 = test 3, ce doit être du au compilateur ( comment fait on une boucle for next en asm ! ce doit être pour cela que step n'accepte que des constantes )


Paneric

Publié : mer. 14/avr./2004 8:03
par Anonyme2
Paneric a écrit :
( comment fait on une boucle for next en asm ! ce doit être pour cela que step n'accepte que des constantes )


Paneric
La boucle for utilise des entiers signés uniquement.

Voici une boucle for et le code assembleur correspondant

Code : Tout sélectionner

; boucle for next
For i = 0 To 10 
  b = i +1
Next i

Code : Tout sélectionner

; boucle for next
; For i = 0 To 10
  MOV    dword [v_i],0     ; la variable i se nomme en asm v_i (car c'est une variable globale dans cet exemple),
                           ; on met i à 0 avec l'instruction MOV, le dword signifie que c'est
                           ; un long donc sur 4 octets
_For1:                     ; _For1: est un label ou étiquette qui permet d'avoir un repère pour faire des sauts
  MOV    eax,10            ; on met la valeur 10 dans le rgistre eax (accumulateur)
  CMP    eax,dword [v_i]   ; CMP --> compare la valeur de eax avec celle de i; cette instruction
                           ; va permettre de placer certains drapeaux du microprocxesseurs avec
                           ; les valeurs correspondantes (Drapeaux AF CF OF PF SF ZF)
  JL    _Next2             ; JL --> Jump if Less (signed) ce qui veut dire saute si inférieur (nombre signé)
                           ; saute à l'étiquette _Next2 si eax est inférieur au contenu de i ce qui signifie
                           ; que i vaudra 11 à la fin de la boucle for i = 0 to 10
                           ; si eax est supérieur à i; l'instruction JL    _Next2 est ignorée
                           ; et on continue avec l'instruction suivante
; b = i +1
  MOV    ebx,dword [v_i]   ; on charge dans le registre ebx le contenu de i (dword = sur 4 octets)
  INC    ebx               ; INC --> on incrémente ebx de 1
  MOV    dword [v_b],ebx   ; on sauvegarde la variable b avec la valeur de ebx soit i + 1
; Next i
_NextContinue2:            ; _NextContinue2 est une étiquette
  INC    dword [v_i]       ; on incrémente i de 1 directement en mémoire avec INC sans passer par un registre
  JMP   _For1              ; JMP --> JUMP = saute à l'étiquette _For1 (on continue la boucle)
_Next2:
 

Publié : mer. 14/avr./2004 9:21
par Paneric
Merci Denis,
cela est très interressant!
je regarde ça de près !

Paneric

Publié : mer. 14/avr./2004 10:14
par Paneric
Denis,
je me suis amusé avec ton exemple:

; for next avec i comme variable de boucle
i.l=0
b.l=0
MOV eax,dword[v_i]

BOUCLE:

INC eax
MOV dword[v_b],eax
CMP eax,10
JL l_boucle

Debug b

; on peut se passer de la variable i de boucle
;
XOR eax,eax ; eax=0
Boucle2:
INC eax
MOV dword[v_b],eax ; b=eax
CMP eax,10
JL l_boucle2

Debug b

Paneric

Publié : mer. 14/avr./2004 11:41
par Anonyme2
Paneric a écrit :Denis,
je me suis amusé avec ton exemple:
Paneric
En fait c'est pas mon exemple mais le code généré par le compilateur PureBasic auquel j'ai ajouté des commentaires.

Effectivement on peut toujours améliorer le code asm mais il ne faut pas oublier que le compilateur doit s'adapter à un grand nombre de possibilités; ce code est donc un code pas forcément le plus rationnel mais parfaitement fonctionnel et qui dans bien des cas n'est pas critique en terme de vitesse. Si on veut améliorer, il faudra 'reprendre le code' asm à la main.

Publié : mer. 14/avr./2004 11:58
par Fred
je suis étonné de voir que les resultats sont diffent entre 'while pb' et 'while asm' etant donné que le compilateur genere exactement le meme code pour les 2 (et oui, l'asm sert a rien ici :wink: ). Voir le fichier purebasic.asm en mode /COMMENTED.

extrait:

Code : Tout sélectionner


; While h <= 100000*1000 : h+1 : Wend 
_While3:
  MOV    ebx,dword [v_h]
  CMP    ebx,100000000
  JG    _Wend3
  INC    dword [v_h]
  JMP   _While3

et

; While h <= 100000*1000 : INC h : Wend 
_While4:
  MOV    ebx,dword [v_h]
  CMP    ebx,100000000
  JG    _Wend4
  INC    dword [v_h]
  JMP   _While4
_Wend4:


Publié : mer. 14/avr./2004 12:36
par cederavic
j'ai pa tricher! jurer cracher! :lol:

Publié : mer. 14/avr./2004 13:47
par Guimauve
Les résultats sur mon PC dans l'éditeur mais avec le déboggeur désactivé.

For next = 281ms
while wend & pb = 282ms
while wend & asm = 344ms

AMD Athlon 2200XP
512 Mb ram DDR400

Publié : jeu. 15/avr./2004 8:55
par Paneric
Oui, je suis étonné aussi !
par contre, je n'arrive pas à récupérer le fichier *.asm alors que je donne le bon paramètre au compilateur.

Paneric

Publié : jeu. 15/avr./2004 9:16
par Fred
tu donnes quoi comme paramètre ?

Publié : jeu. 15/avr./2004 9:19
par Paneric
Je donne /COMMENTED au compilateur si je suis l'aide en ligne !

est-ce la procédure ?

Paneric