Page 1 sur 3

le compilateur manque de performances dans les boucles !

Publié : sam. 03/janv./2009 14:52
par Mytic
Bonjour,
J'ai voulu faire un petit test de performances ASM/PB et les résultats sont nettes ! testez et vous verrez.. :?

!!! désactivez le débogueur avant !!!

Code : Tout sélectionner

;==========================
;      Test by Mytic
;==========================
; 

; !!! désactivez le débogueur avant !!!
max = 999999999
Delay(1000)

;=================================(ASM)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
!PUSH EAX
!PUSH EBX
!MOV EAX,[v_a]
!MOV EBX,[v_max]
!LP1:
!INC EAX
!CMP EAX,EBX
!JNE LP1
!MOV [v_a],EAX
!POP EBX
!POP EAX
S1.d = ElapsedMilliseconds()-t
;MessageRequester("ASM",StrD(S1))


;=================================(Semi ASM/PB!)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
!PUSH EAX
!MOV EAX,[v_a]
Repeat
 !INC EAX
 !MOV [v_a],EAX
Until(a=max)
!POP EAX
S2.d = ElapsedMilliseconds()-t
;MessageRequester("Semi ASM/PB!",StrD(S2))


;=================================(PB!)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
Repeat
 a+1
Until(a=max)
S3.d = ElapsedMilliseconds()-t
;MessageRequester("PB!",StrD(S3))

;============================( Conclusion )
R$ = "ASM            =  " + Str(S1) + #CRLF$ + "Semi ASM/PB!   =  " + Str(S2) + #CRLF$ + "PB!            =  " + Str(S3)
MessageRequester("Comparaison",R$)

Sur ma machine ça donne :
Asm = 511ms
ASM/PB = 1656ms
PB = 2422ms
:idea:

Publié : sam. 03/janv./2009 15:21
par cha0s
essaye

Code : Tout sélectionner

While Not (a=max)
 a+1
Wend
sur ma machine c'est plus rapide que

Code : Tout sélectionner

Repeat
 a+1
Until(a=max) 

Publié : sam. 03/janv./2009 15:28
par Mytic
ça donne presque les mêmes résultats qu'avec un UNTIL ! je suppose que c'est l'ordonnanceur de Windows qui donne ces nuances.

Publié : sam. 03/janv./2009 15:30
par Anonyme
ca donne vraiment envie de se coller à l'asm.

Publié : sam. 03/janv./2009 15:34
par Mytic
Cpl.Bator a écrit :ca donne vraiment envie de se coller à l'asm.
Pour faire des programmes performants on ne peut pas laisser de coté l'assembleur.

Aucun compilateur au monde ne peut égaler un cerveau humain dans l'optimisation.

Publié : sam. 03/janv./2009 15:55
par Backup
sauf que dans le cas présent le plus rapide c'est For-next !!

ça fais d'ailleurs un moment que j'avais démontré qu'une boucle for-next
etait plus rapide qu'un "repeat-untilet autre while-wend"

puisque dans for-next ya pas le meme test pour savoir si la boucle se termine !!! ;)

Code : Tout sélectionner

;==========================
;      Test by Mytic
;==========================
;

; !!! désactivez le débogueur avant !!!
max = 999999999
Delay(1000)

;=================================(ASM)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
!PUSH Eax
!PUSH Ebx
!MOV Eax,[v_a]
!MOV Ebx,[v_max]
!LP1:
!INC Eax
!CMP Eax,Ebx
!JNE LP1
!MOV [v_a],Eax
!POP Eax
!POP Ebx
S1.d = ElapsedMilliseconds()-t
;MessageRequester("ASM",StrD(S1))


;=================================(Semi ASM/PB!)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
!PUSH Eax
!MOV Eax,[v_a]
Repeat
    !INC Eax
    !MOV [v_a],Eax
Until(a=max)
!POP Eax
S2.d = ElapsedMilliseconds()-t
;MessageRequester("Semi ASM/PB!",StrD(S2))


;=================================(PB!)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
Repeat
    a+1
Until(a=max)
S3.d = ElapsedMilliseconds()-t
;MessageRequester("PB!",StrD(S3))

;=================================(PB!)============================
Delay(1000)
t.d = ElapsedMilliseconds()
For a=1 To max
Next a
S4.d = ElapsedMilliseconds()-t
;MessageRequester("PB!",StrD(S3))

;============================( Conclusion )
R$ = "ASM            =  " + Str(S1) + #CRLF$ + "Semi ASM/PB!   =  " + Str(S2) + #CRLF$ + "PB!            =  " + Str(S3) +#CRLF$ + "PB!    for_next   =  " + Str(S4)
MessageRequester("Comparaison",R$) 
chez moi les résultats sont (sur mon NC10TS):
ASM = 3797
Semi ASM/PB! = 3969
PB! = 2593
PB! for_next = 2375

Publié : sam. 03/janv./2009 16:04
par Mytic
heu chez moi ça donne ça :
Image

au fait j'ai inversé les POP dans le code ASM !
c'est
!POP EBX
!POP EAX
Dsl [c'est corrigé dans le 1er code]
(ça n'a aucun effet sur la vitesse , mais c'est plus propre de remettre les registres à leurs valeurs initiales.)

Publié : sam. 03/janv./2009 16:07
par Jacobus
La différence vient aussi des configurations.
J'ai testé le code de Dobro qui me donne:
ASM = 374
Semi ASM/PB = 1326
PB! = 2652
PB! for_next = 2215

Publié : sam. 03/janv./2009 16:11
par Mytic
il faut refaire le test plusieurs fois et faire les moyennes des résultats pour êtes sure à 90%
vu que l'ordonnanceur coupe l'exécution du programme pour donner la main à un autre processus. Et donc on ne peut pas prévoir quand ces interruptions auront lieu.

Publié : sam. 03/janv./2009 17:28
par Le psychopathe
pour moi sur un athlon x2 5600+, 2go ram et win xp sp3
ASM : 1062
ASM/PB : 1140
PB : 2515

Publié : sam. 03/janv./2009 17:41
par Backup
Le psychopathe a écrit :pour moi sur un athlon x2 5600+, 2go ram et win xp sp3
ASM : 1062
ASM/PB : 1140
PB : 2515
ET mon test for_next ??

Publié : sam. 03/janv./2009 17:44
par Mytic
:) ce test permet aussi de déterminer quels sont les microprocesseurs les plus puissants.

Mais bon entre la version ASM et la version PB il y'a une différence de 1,8s(en moyenne) ce qui n'est pas négligeable. Si on devait traduire cette durée à l'échelle humaine c'est égal à 1 ans et 8 mois :roll:

Publié : sam. 03/janv./2009 18:28
par Backup
pas totu a fait !!

puisque les résultats dépendent aussi du nombre de taches en ram
ainsi que des services en arriere plan !!

j'ai souvent vu des résultats de test fait par des gens qui avaient un "moins puissant" proc que le miens, et faire mieux !! :)

Publié : sam. 03/janv./2009 18:40
par Le psychopathe
Dobro a écrit :
Le psychopathe a écrit :pour moi sur un athlon x2 5600+, 2go ram et win xp sp3
ASM : 1062
ASM/PB : 1140
PB : 2515
ET mon test for_next ??
Alors nouveau test avec ton code, antivirus coupé + toutes les applications :

Code : Tout sélectionner

ASM : 1062
ASM/PB : 1157
PB : 2750
PBnext : 2765
Resultat à la baisse pourtant xD

Publié : sam. 03/janv./2009 19:10
par Cls
Ma contribution à l'expérience :

Image

Testé sur un Core 2 Duo 2.8GHz, 2Go RAM.