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
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
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

). 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!

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