Page 1 sur 2
Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 14:05
par marsu
Je pensais que Purebasic était aussi rapide que le C, vu qu'il est compilé et que les exécutables sont tout petit.
Est-ce que l'on peut changer un paramètre du compilateur pour modifier le ratio taille/vitesse ?
Ci- après l'exemple qui m'a servi de test.
Merci à tous.
Il n'empêche que Purebasic reste formidable ! Il le serait encore plus s'il s'approchait de la vitesse du C.....
; à compiler en lib static
;
; #include <stdlib.h>
; #include <time.h>
;
; int Boucle_PelleC()
; {
; clock_t start = clock();
;
; long int i=0;
; long int j=0;
; long int c;
; long int a=8;
; long int b=8;
;
; For(j=0; j<0xFFFFF; j++)
; For(i=0; i<1000; i++)
; c=a*b;
;
; printf("Time elapsed PELLEC : %f\n", ((float)clock() - start) / CLOCKS_PER_SEC);
;
; Return 0;
; }
Import "testlib.lib"
Boucle_PelleC.l()
EndImport
Procedure Boucle_PB()
Protected start.l, i.l,j.l,a.l,b.l,c.l
a=8
b=8
start.l=ElapsedMilliseconds()
For j=0 To $FFFFF
For i = 0 To 1000
c=a*b;
Next
Next
PrintN("Time elapsed PB : "+StrF((ElapsedMilliseconds()-start)/1000))
EndProcedure
Procedure Main()
Protected start.l
OpenConsole()
ConsoleTitle ("Test C vs PureBasic")
Boucle_PB()
Boucle_PelleC()
Input()
CloseConsole()
EndProcedure
Main()
; Le Résultat
;-------------
;Time elapsed PB : 4.6020002365
;Time elapsed PELLEC : 0.701000
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 14:42
par Backup
oui mais ..
ton test ne teste pas que les boucles , il test aussi l'appel a procedure ..
de plus Purebasic a toujours été lent avec les boucles for-next ; j'avais signalé ça , il y a super longtemps
si tu test avec while wend , tu verra
remarque que dans le code qui suit , j'ai suprimé les procedures , et ajouté 2 "F" a $FFFFF ce qui fait une boucle a $FFFFFFF (7xF) ...
soit bien plus que ton code
Code : Tout sélectionner
a=8
b=8
start.l=ElapsedMilliseconds()
while j< $FFFFFFF
j+1
while i< 1000
i+1
c=a*b
wend
wend
resultat$= StrF((ElapsedMilliseconds()-start)/1000)
messagerequester("info","Time elapsed PB : "+resultat$)
setClipboardText(resultat$)
; EPB
chez moi :
il faut tenir compte des spécificités des langages , certains sont fort sur certaines instructions, d'autre pas ..
c'est pour ça qu'il ne faut pas comparer les fonctions parcequ'elle portent un nom identique ...
seulement apprendre a l'usage a connaitre le langage qu'on utilise
ps met ton code entre les balises (bouton Code au moment de la redaction )
pour le fun j'ai aussi augmenté la boucle des 1000 par 100000
Code : Tout sélectionner
a=8
b=8
start.l=ElapsedMilliseconds()
while j< $FFFFFFF
j+1
while i< 100000
i+1
c=a*b
wend
wend
resultat$= StrF((ElapsedMilliseconds()-start)/1000)
messagerequester("info","Time elapsed PB : "+resultat$)
setClipboardText(resultat$)
; EPB
resultat chez moi :
0.6710000038
on vois bien qu'une fois transformé en assembleur
une boucle for next prends :
Code : Tout sélectionner
MOV dword [v_i],1 ; for i= 1 to 255
_For1:
MOV eax,255
CMP eax,dword [v_i]
JL _Next2
_NextContinue2: ; next i
INC dword [v_i]
JNO _For1
_Next2:
;
et qu'une boucle While-wend
Code : Tout sélectionner
_While3: ; while b< 255
MOV ebx,dword [v_b]
CMP ebx,255
JGE _Wend3
INC dword [v_b] ; b+1
JMP _While3 ; wend
_Wend3:
[reedit]
en fait , je ne comprends pas pourquoi for-next rame plus que While-wend

si ce n'est que For-next compare le contenu d'une variable
alors que While wend compare une valeur directe !!!
le gain doit venir de là .. je pense

Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 15:18
par grabiller
Oui, sauf que votre code est buggé.
En effet, il faut réinitialiser i à 0 à chaque boucle de j:
Sinon vous effectuez $FFFFFFF boucles au lieu de $FFFFFFF x 1000 boucles, ce qui n'est plus tout à fait pareil
Il est donc normal que votre While/Wend aille 1000x plus vite.
Perso j'obtiens des temps équivalents entre For/Next et While/Wend, quoiqu'effectivement 'légèrement' plus rapide pour le While/Wend (de l'ordre de 3/4 dixième de secondes, pas plus )
Cordialement,
Guy.
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 15:31
par Backup
ha bah oui tiens

... ho la loose !

Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 16:06
par marsu
Merci pour vos analyses. J'avais aussi essayer de remplacer la boucle for par une boucle while.
Personnellement, je ne comprend pas qu'il puisse y avoir une telle différence sur une instruction aussi simple.
Peut-etre est-ce lié à la petite taille de l'exécutable qui du coup n'optimise pas la vitesse.
C'est dommage, car j'adore Purebasic, je pense que j'écrirai des fonctions C pour les traitements qui nécessitent de la performance.
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 16:33
par djes
Ben c'est simple, pour un petit programme comme celui-là, le compilo C va sûrement utiliser les registres, tandis que PB se contentera de variables stockées en mémoire. Cela n'a rien à voir en termes de vitesse. En situation réelle cependant, il y a beaucoup plus d'accès mémoire, donc la différence s'estompe. Ces petits tests reflètent peu la réalité et la multitude de situations. Il y a cependant des petites choses à savoir en PB pour améliorer les perfs. Enfin... ! Est-ce vraiment si nécessaire ? De mon expé, windows est quand même autrement responsable de la lenteur, des lags et de la mauvaise expérience utilisateur, bien que là aussi ça s'estompe avec la puissance des machines.
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 16:43
par Ar-S
J'ajoute qu'un exe de 100ko va se lancer instantanément alors que le même lourdaud de 2mo ou plus généré en C mettra autant de ms voir de secondes pour se lancer.. ça devrait entrer en ligne de compte si on veut chipoter.
Mais il est claire que c'est la réactivité globale d'un même programme dans les 2 langage qu'il faudrait étudier.
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 16:45
par SPH
tu as toujours la possibilité de faire de l'asm (comme le dit dobro)
Code : Tout sélectionner
temps=ElapsedMilliseconds()
!mov ecx,1000000
!debut:
!nop
!loop debut
Debug ElapsedMilliseconds()-temps
;;;;;;;;;;;;;;;;;;;;;;;
temps=ElapsedMilliseconds()
For I=1 To 1000000
Next
Debug ElapsedMilliseconds()-temps
Re: Performance Boucle en C vs Purebasic
Publié : mar. 18/sept./2012 22:43
par Fred
Ces tests 'synthetiques' seront toujours à l'avantage du C, car il possède un meilleur optimisateur que PureBasic (utilisation meilleure des registres, inlining des boucles, prise en compte du pairing des instructions assembleur etc.). Il faut garder à l'esprit que même si le code généré est très rapide (full assembleur optimisé convenablement), il n'a jamais eu pour but de concurrencer les compilateurs C professionnels où plusieurs dizaines de developpeurs bossent à plein temps rien que pour optimiser le code généré.
Cependant, comme l'a fait remaqué Djes, il est rare d'avoir des portions de codes très consommateur en CPU qui n'utilise aucune fonction interne de PB (sauf cas extreme comme traitement du signal, filtre d'images etc.). Et comme toutes les fonctions de PB sont soit en C, soit en ASM, elle sont forcement aussi rapides que leur equivalent C, et l'ecart devient négligeable.
ps: quand je vois un test de perf avec un "Debug ElapsedMilliseconds()-temps", ca fait peur

Ar-s: les programmes C sont aussi petits que les exe PB..
Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 1:27
par G-Rom
ps: quand je vois un test de perf avec un "Debug ElapsedMilliseconds()-temps", ca fait peur
j'allais lui mettre une biffle ! une bifle ? oui , une bifle, une gifle avec la bi...

Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 7:06
par marsu
Merci à tous pour ces réponses, et à Fred qui surveille ce qui se dit sur les performances de Purebasic.
Depuis que j'ai découvert Purebasic...je suis tombé à croc. La facilité de développement, l'aspect portable du compilateur (clé usb), différente plateforme, l'intégration des api, des librairies C.
Tout cela est formidable, le petit test était juste pour comprendre. D'autant qu'il est très facile d'intégré une fonction C via une librarie C static dans purebasic si le besoin s'en ressent.
Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 10:31
par Kwai chang caine
Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 10:32
par SPH
Moi, j'ai pas trouvé ca drole ! Ca craint meme !!!

Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 10:33
par Kwai chang caine
Bah moi le soldat y me faire rire

Remarque j'ai pas vu la taille de la matraque

Re: Performance Boucle en C vs Purebasic
Publié : mer. 19/sept./2012 10:35
par SPH
Fred a écrit :ps: quand je vois un test de perf avec un "Debug ElapsedMilliseconds()-temps", ca fait peur
Bin quoi d'autre !!!!
