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 :

Code : Tout sélectionner

0.6710000038
:)


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 8O
si ce n'est que For-next compare le contenu d'une variable
alors que While wend compare une valeur directe !!! :D
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:

Code : Tout sélectionner

While j<  $FFFFF
   j+1 : i=0
   While i< 1000
      i+1
; ...
Sinon vous effectuez $FFFFFFF boucles au lieu de $FFFFFFF x 1000 boucles, ce qui n'est plus tout à fait pareil :wink:

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 :oops: ... ho la loose ! :lol:

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) :wink:

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... :mrgreen:

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
G-Rom a écrit :j'allais lui mettre une biffle ! une bifle ? oui , une bifle, une gifle avec la bi... :mrgreen:
:lol: :lol:

Re: Performance Boucle en C vs Purebasic

Publié : mer. 19/sept./2012 10:32
par SPH
Kwai chang caine a écrit :
G-Rom a écrit :j'allais lui mettre une biffle ! une bifle ? oui , une bifle, une gifle avec la bi... :mrgreen:
:lol: :lol:
Moi, j'ai pas trouvé ca drole ! Ca craint meme !!! 8O

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 :lol: :lol:
Remarque j'ai pas vu la taille de la matraque :mrgreen:

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 !!!! :oops: