Performance Boucle en C vs Purebasic
Performance Boucle en C vs Purebasic
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
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
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
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
resultat chez moi : 
on vois bien qu'une fois transformé en assembleur
une boucle for next prends :
et qu'une boucle While-wend
[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
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
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
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:
;
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:
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

- 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
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.
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
; ...

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
Re: Performance Boucle en C vs Purebasic
ha bah oui tiens
... ho la loose ! 


Re: Performance Boucle en C vs Purebasic
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.
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
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
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.
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: Performance Boucle en C vs Purebasic
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
!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
Re: Performance Boucle en C vs Purebasic
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..
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
j'allais lui mettre une biffle ! une bifle ? oui , une bifle, une gifle avec la bi...ps: quand je vois un test de perf avec un "Debug ElapsedMilliseconds()-temps", ca fait peur

Re: Performance Boucle en C vs Purebasic
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.
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.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: Performance Boucle en C vs Purebasic
G-Rom a écrit :j'allais lui mettre une biffle ! une bifle ? oui , une bifle, une gifle avec la bi...


Re: Performance Boucle en C vs Purebasic
Moi, j'ai pas trouvé ca drole ! Ca craint meme !!!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...![]()

!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
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: Performance Boucle en C vs Purebasic
Bah moi le soldat y me faire rire

Remarque j'ai pas vu la taille de la matraque


Remarque j'ai pas vu la taille de la matraque

Re: Performance Boucle en C vs Purebasic
Bin quoi d'autre !!!!Fred a écrit :ps: quand je vois un test de perf avec un "Debug ElapsedMilliseconds()-temps", ca fait peur![]()

!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