Map PureBasic vs Tableau associatif PHP7

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Map PureBasic vs Tableau associatif PHP7

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

Re: Map PureBasic vs Tableau associatif PHP7

Message 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.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Re: Map PureBasic vs Tableau associatif PHP7

Message 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 :D
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Map PureBasic vs Tableau associatif PHP7

Message par Ollivier »

Augmenter la taille des slots pour combler la lacune de la vitesse, c'est faisable ?
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Map PureBasic vs Tableau associatif PHP7

Message par G-Rom »

Qu'est ce que tu suggères pour faire cela ?
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Map PureBasic vs Tableau associatif PHP7

Message 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)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Map PureBasic vs Tableau associatif PHP7

Message par falsam »

Tu vois G-Rom que j'avais raison. Le code PB était moisi :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Map PureBasic vs Tableau associatif PHP7

Message par G-Rom »

@Fred, tu triches, tu utilises un pointeur ! :mrgreen:
42ms ici ^^
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Map PureBasic vs Tableau associatif PHP7

Message 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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Map PureBasic vs Tableau associatif PHP7

Message 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.
Dernière modification par falsam le lun. 03/août/2015 21:30, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Map PureBasic vs Tableau associatif PHP7

Message 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 :mrgreen:
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Map PureBasic vs Tableau associatif PHP7

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

Re: Map PureBasic vs Tableau associatif PHP7

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

Re: Map PureBasic vs Tableau associatif PHP7

Message par G-Rom »

63ms avec des const char* , PB est toujours au dessous 42ms.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Map PureBasic vs Tableau associatif PHP7

Message 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)
Répondre