le compilateur manque de performances dans les boucles !

Programmation d'applications complexes
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Sous GNU/Linux avec un (vieil) Athlon 1.4 Ghz:

Code : Tout sélectionner

ASM ........... 1948
Semi ASM/PB ... 3052
PB ............ 5142
PB For/Next.... 5491
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Avec mon bourrin de Core2Duo E8200 - 2go

Image

impressionnant..
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

J'ai voulu restester vu que je viens de formater et reinstaller mon vista mais cela plante ( je suis sous vista 64bits et PB 64).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

apparemment ya pas photo !! 8O

faudrai ptete en parler a Fred !! :?

l'Asm est beaucoup plus rapide alors !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Sur un MacBook d'il y a un an : (1Go de ram, 2.18Ghz je crois)

Code : Tout sélectionner

ASM ........... 469 
Semi ASM/PB ... 1625 
PB ............ 3258 
PB For/Next.... 2859
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Interressant ces diverse boucles possibles et leur vitesses.

S'il reste "facile" à comprendre le fonctionnement, comment on utilise le code assembleur pour recuperer la valeur incrementé = a ?

Code : Tout sélectionner

;Classique en for next

max = 999999999
a.l = 0

for a= 1 to max
i=a+1
next a

debug i

; mais en ASM on procede comment ?

!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

Merci de toute explication
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Y'aurait moyen d'en faire un zolie macro?

(je comprends RIEN à l'asm, alors patapé si j'ai dit une connerie plus grosse que moi)
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Message par zaphod »

Pour récupérer le compteur dans une variable :

Code : Tout sélectionner

max = 999999999 
Delay(1000) 

;=================================(ASM)============================ 
Delay(1000) 
t.d = ElapsedMilliseconds() 
a.l = 0 
i.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 
!mov [v_i],eax ; on recupère le compteur dans i
!POP EBX 
!POP EAX 
S1.d = ElapsedMilliseconds()-t 
Debug i
MessageRequester("ASM",StrD(S1)) 
Z@ph0d//
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bonjour cher tous, j'ai pris le code de Mytic page 1, et j'ai testé sur mon engin:

Version 4.30 :
ASM : 4375
ASM/PB : 5406
PB : 4375
Version 4.31 :
ASM : 4328
ASM/PB : 5328
PB : 4360
(XP SP3)

Je n'ai pas de commentaire... Si quelqu'un peut m'expliquer où est votre problème, ça m'enlèverait un grain...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Vista (+ double coeur)

ASM 1544
PB/ASM 1607
PB 3807
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Message par zaphod »

sur mon p4 3.06 ht

asm =594
semi = 1328
pb=2000

en desactivant le debuger.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Atomo avait posté un test de boucle multi-thread: ptêt qu'il faudrait relier ces tests avec ces comparatifs chronométrés?
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

J'ai testé avec le code de la boucle mutli-threadée, le resultat est encore pire :oops:
Apparement, c'est éfficace que dans certaines situations.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Juste pour info, il faudrait que vous sépariez vos codes, car le fait qu'ils soient les uns derrière les autres change la donne. En effet, un code non correctement aligné en mémoire peut être sensiblement plus lent. Exemple (commentez le !nop) :

Code : Tout sélectionner

max = 999999999
Delay(1000)

;=================================(ASM)============================
Delay(1000)
!nop
t.d = ElapsedMilliseconds()
a.l = 0
i.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
!mov [v_i],eax ; on recupère le compteur dans i
!POP EBX
!POP EAX
S1.d = ElapsedMilliseconds()-t
Debug i
MessageRequester("ASM",StrD(S1)) 
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Test sur :

XP
Intel Core Duo E6850 3.00 Ghz
4 Go de Ram

ASM________328
Semi ASM___1172
PB_________2344
PB For Next__1922



Z@ph0d, ok pour la recup de la variable en fin de boucle.

Code : Tout sélectionner


max = 999999999
Delay(1000)

;=================================(ASM)============================
Delay(1000)
t.d = ElapsedMilliseconds()
a.l = 0
i.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
!mov [v_i],eax ; on recupère le compteur dans i
!POP EBX
!POP EAX
S1.d = ElapsedMilliseconds()-t
Debug i
MessageRequester("ASM",StrD(S1)) 
Et si l'on souhaite utiliser la valeur de la variable i pendant l'incrementation , on procede comment ?

Merci de tout explicatif.
Répondre