le compilateur manque de performances dans les boucles !

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

le compilateur manque de performances dans les boucles !

Message 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:
Dernière modification par Mytic le sam. 03/janv./2009 15:48, modifié 1 fois.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message 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) 
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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.
Anonyme

Message par Anonyme »

ca donne vraiment envie de se coller à l'asm.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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.)
Dernière modification par Mytic le sam. 03/janv./2009 16:08, modifié 1 fois.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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.
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

pour moi sur un athlon x2 5600+, 2go ram et win xp sp3
ASM : 1062
ASM/PB : 1140
PB : 2515
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ??
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :)
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message par Cls »

Ma contribution à l'expérience :

Image

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