Page 1 sur 3
Map PureBasic vs Tableau associatif PHP7
Publié : dim. 02/août/2015 13:48
par erix14
Comme vous le savez surement, la version bêta de PHP7 est sortie dernièrement. La promesse est une vitesse d'exécution doublée par rapport à PHP 5.6. Et c'est bien le cas d'après les tests que j'ai pu faire. J'ai ensuite voulu comparer avec PureBasic... Comme je suis un professionnel du Web, je manipule tout les jours des tableaux associatifs en PHP alimentés via MySQL. J'étais donc curieux de connaitre le gain de performance si je devais passer par PureBasic. Mais là, j'ai été très surpris et déçu par PureBasic, voici les codes :
PHP ( temps d'exécution sur mon ordi 61ms ) :
Code : Tout sélectionner
<?php
$time_start = microtime(true);
$TEmployes = array();
for($t=1;$t<=200000;$t++){
$TEmployes['PureBasic']['Commercial']['Reference'.$t] = array(
'Prenom'=>'Pierre '.$t,
'Nom'=>'Dupond',
'Age'=>28
);
}
$Controle = 'Prénom du commercial <b>Reference9999</b> : '.$TEmployes['PureBasic']['Commercial']['Reference9999']['Prenom'].'<br/>';
$time_end = microtime(true);
$time = $time_end - $time_start;
echo $Controle.'Temps : '.($time*1000).' ms';
?>
PureBasic ( temps d'exécution sur mon ordi 963ms ) :
Code : Tout sélectionner
EnableExplicit
Global t.L, TimeDebut.q, TimeFin.q
Structure Employe
Prenom.s
Nom.s
Age.L
EndStructure
Structure Service
Map Employe.Employe()
EndStructure
Structure Societe
Map Service.Service()
EndStructure
Global NewMap Societe.Societe()
TimeDebut = ElapsedMilliseconds()
For t=1 To 200000
With Societe("PureBasic")\Service("Commercial")\Employe("Reference"+Str(t))
\Prenom = "Pierre "+Str(t)
\Nom = "Dupond"
\Age = 28
EndWith
Next
Global Controle.s = "Prénom du commercial Reference9999 : "+Societe("PureBasic")\Service("Commercial")\Employe("Reference9999")\Prenom + Chr(10)
TimeFin = ElapsedMilliseconds()
MessageRequester("Temps d'exécution", Controle + Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
PureBasic se fait pulvériser par PHP7 sur les Maps, ça serait donc bien que Fred optimise tout ça pour que ce soit au moins aussi rapide que PHP7.
Re: Map PureBasic vs Tableau associatif PHP7
Publié : dim. 02/août/2015 17:13
par G-Rom
Bonjour Erix , content de te relire , avec ton code :
Php5.x sur Raspberry PI 2 : 3224ms
PBx64 linux : 1704ms
C++/STL : 170ms
Conclusion , effectivement, l'usage de la STL ( unordered_map ) serais un plus.
Re: Map PureBasic vs Tableau associatif PHP7
Publié : dim. 02/août/2015 19:23
par erix14
Bonjour G-Rom,
En PHP5.6, j'obtiens avec mon exemple 232ms (pour info, j'ai un i5-4670K), soit 3.7 fois plus lent que le PHP7. Ce qui veut dire que tu peux obtenir 871ms sur ton Raspberry.
Il est vraiment bien ce PHP7

Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 14:56
par Ollivier
Augmenter la taille des slots pour combler la lacune de la vitesse, c'est faisable ?
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 20:58
par G-Rom
Qu'est ce que tu suggères pour faire cela ?
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:11
par Fred
Ce test est biaisé, car le 'With' recolle toute l'expression devant chaque champs. Donc il fait 6x plus de lookup que la version PHP.
C'est equivalent à ca:
Code : Tout sélectionner
For t=1 To 200000
Societe("PureBasic")\Service("Commercial")\Employe("Reference"+Str(t))\Prenom = "Pierre "+Str(t)
Societe("PureBasic")\Service("Commercial")\Employe("Reference"+Str(t))\Nom = "Dupond"
Societe("PureBasic")\Service("Commercial")\Employe("Reference"+Str(t))\Age = 28
Next
Essaie ca plutot:
Code : Tout sélectionner
EnableExplicit
Global t.L, TimeDebut.q, TimeFin.q
Structure Employe
Prenom.s
Nom.s
Age.L
EndStructure
Structure Service
Map Employe.Employe()
EndStructure
Structure Societe
Map Service.Service()
EndStructure
Global NewMap Societe.Societe()
TimeDebut = ElapsedMilliseconds()
For t=1 To 200000
Define *a.Employe = Societe("PureBasic")\Service("Commercial")\Employe("Reference"+Str(t))
With *a
\Prenom = "Pierre "+Str(t)
\Nom = "Dupond"
\Age = 28
EndWith
Next
Global Controle.s = "Prénom du commercial Reference9999 : "+Societe("PureBasic")\Service("Commercial")\Employe("Reference9999")\Prenom + Chr(10)
TimeFin = ElapsedMilliseconds()
MessageRequester("Temps d'exécution", Controle + Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
C'est quasi instantané ici (88 ms)
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:22
par falsam
Tu vois G-Rom que j'avais raison. Le code PB était moisi

Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:26
par G-Rom
@Fred, tu triches, tu utilises un pointeur !
42ms ici ^^
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:28
par Fred
Pas du tout, c'est la même chose que le code PHP posté (un seul lookup puis une affectation)

. Voila, tu peux ranger ta STL ^^
ps: il ne faut pas oublier que 'WITH' est ni plus ni moins qu'une macro:
http://www.purebasic.com/french/documen ... dwith.html
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:30
par falsam
Avec le code Php, on avait d'une seule société, qu'un seul service commercial et 200000 employés pour ce service commercial.
J'ai fait le test avec 200000 Sociétés, 200000 services commerciaux et 200000 employes. Le résultat est sans appel. PureBasic (avec l'ancien code) était largement en tète.
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:30
par G-Rom
J'étais en train de cherché un soucis dans mon code c++, en y a pas , conclusion PB explose la STL & LE PHP7... trop fort le Fred

Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:32
par Fred
C'est quand meme bizarre d'etre plus rapide que la STL, tu peux poster ton code C++ ? Y'a pas du std::string un peu partout ?

Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:34
par G-Rom
Bah si, je viens d'y pensé , PB ressemble plus à du const char *
Code : Tout sélectionner
#include <SFML/System.hpp>
#include <unordered_map>
#include <iostream>
#include <string>
int main(){
struct Employe{
std::string prenom;
std::string nom;
short age;
};
struct Service{
std::unordered_map<std::string,Employe> employe;
};
struct Societe{
std::unordered_map<std::string,Service> service;
};
std::unordered_map<std::string,Societe> societe;
sf::Clock clock;
clock.restart();
for(int i=0; i<200000; ++i){
Employe* employe = &societe["purebasic"].service["commercial"].employe["reference"+std::to_string(i)];
employe->prenom = "Pierre "+std::to_string(i);
employe->nom = "Dupond";
employe->age = 28;
}
std::cout << "Prénom du commercial Reference9999 : "
<< societe["purebasic"].service["commercial"].employe["reference9999"].prenom
<< std::endl
<< " temps = "
<< clock.getElapsedTime().asMilliseconds() << std::endl;
}
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 21:37
par G-Rom
63ms avec des const char* , PB est toujours au dessous 42ms.
Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 23:00
par Ollivier
Bonjour G-Rom,
Je suggére d'augmenter le nombre de slots de la map de 512 à 16384 et de comparer les deux. Cela augmentera encore la vitesse du compilateur.
Il manque des critères aux test, et Fred se défend mal. Les champs de structures, à mon humble avis, peuvent être intégrées DANS la clé. Cela apporte aussi vitesse, simplification et souplesse d'accès technique, disponibles à l'utilisateur.
Ce qui serait d'une notable utilité c'est que Fred pense à faire asservir l'algorithme de hachage, de telle sorte que le programmeur puisse programmer un (ou plusieurs) algo(s) personnalisé(s) et le(s) faire exécuter "nativement".
Mais il faut une innovation dans le type d'appel de code. Car, l'exemple du dessin pixel par pixel, chacun issu de l'exécution d'une procédure calculant la couleur, c'est trop lent. Du moins, si c'est concevable en dessin, ça ne l'est pas pour une map à algo "perso". Chaque instruction superflue est cause de perte de temps, et les sauts, les appels, et les retours sont, dans l'idéal, non nécessaires.
Aussi, si l'on pouvait aussi fournir une macro, au lieu d'une adresse de procédure, cela serait le pied.
(et bonjour à Erix14)