Performance Boucle en C vs Purebasic

Sujets variés concernant le développement en PureBasic
marsu
Messages : 7
Inscription : ven. 16/mai/2008 7:18

Performance Boucle en C vs Purebasic

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

Re: Performance Boucle en C vs Purebasic

Message 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 :)
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

Re: Performance Boucle en C vs Purebasic

Message 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.
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Performance Boucle en C vs Purebasic

Message par Backup »

ha bah oui tiens :oops: ... ho la loose ! :lol:
marsu
Messages : 7
Inscription : ven. 16/mai/2008 7:18

Re: Performance Boucle en C vs Purebasic

Message 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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Performance Boucle en C vs Purebasic

Message 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.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Performance Boucle en C vs Purebasic

Message 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.
~~~~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
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Performance Boucle en C vs Purebasic

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Fred
Site Admin
Messages : 2807
Inscription : mer. 21/janv./2004 11:03

Re: Performance Boucle en C vs Purebasic

Message 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..
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Performance Boucle en C vs Purebasic

Message 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:
marsu
Messages : 7
Inscription : ven. 16/mai/2008 7:18

Re: Performance Boucle en C vs Purebasic

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Performance Boucle en C vs Purebasic

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Performance Boucle en C vs Purebasic

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Performance Boucle en C vs Purebasic

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: Performance Boucle en C vs Purebasic

Message 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:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre