Re: Map PureBasic vs Tableau associatif PHP7
Publié : lun. 03/août/2015 23:17
cela n'a pas d'impact sur le temps d’exécution , en l'augmentant considérablement ( x10 ) on triple les temps d'accès.
Forums PureBasic - Français
https://www.purebasic.fr/french/
Code : Tout sélectionner
Global Dim B((1 << 24) - 1)
#ISi = SizeOf(Integer)
*x = AllocateMemory(#ISi)
PokeI(*x, 28)
mSize = 8
Lap0 = ElapsedMilliseconds()
Nom.S = "000000Age"
an = @Nom
For I5 = 0 To 1
PokeA(an, I5)
For I4 = 0 To 9
PokeA(an + 1, I4)
For I3 = 0 To 9
PokeA(an + 2, I3)
For I2 = 0 To 9
PokeA(an + 3, I2)
For I1 = 0 To 9
PokeA(an + 4, I1)
For I0 = 0 To 9
PokeA(an + 5, I0)
mBuffer = @Nom
Key = CRC32Fingerprint(mBuffer, mSize)
Key & $FFFFFF
If B(Key)
C + 1
EndIf
B(Key) = *x
N + 1
Next
Next
Next
Next
Next
Next
Lap1 = ElapsedMilliseconds()
MessageRequester(Str(n) + " entité(s)", "Durée de charge : " + Str(Lap1 - Lap0) + "ms // Collisions :" + Str(C) )
erix14 a écrit :Bonjour à tous,
J'avais déjà essayé avec les pointeurs, c'est pour cela que j'avais ajouté une variable de contrôle. Avec le code de Fred, le prénom de la Reference9999 est Pierre 200000, ce n’est donc pas bon...
D'ailleurs si on ajoute un => Debug MapSize(Societe("PureBasic")\Service("Commercial")\Employe()), mon code renvoie bien 200000 employés, alors que le code de Fred 0.
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 = AddMapElement(Societe("PureBasic"+Str(t))\Service("Commercial"+Str(t))\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("PureBasic9999")\Service("Commercial9999")\Employe("Reference9999")\Prenom + Chr(10)
TimeFin = ElapsedMilliseconds()
MessageRequester("Temps d'exécution", Controle + Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
Code : Tout sélectionner
<?php
$time_start = microtime(true);
$TEmployes = array();
for($t=1;$t<=200000;$t++){
$TEmployes['PureBasic'.$t]['Commercial'.$t]['Reference'.$t] = array(
'Prenom'=>'Pierre '.$t,
'Nom'=>'Dupond',
'Age'=>28
);
}
$Controle = 'Prénom du commercial <b>Reference9999</b> : '.$TEmployes['PureBasic9999']['Commercial9999']['Reference9999']['Prenom'].'<br/>';
$time_end = microtime(true);
$time = $time_end - $time_start;
echo $Controle.'Temps : '.($time*1000).' ms';
?>
Code : Tout sélectionner
With *a
\Prenom = "Pierre "+Str(t)
\Nom = "Dupond"
\Age = 28
EndWith
Code : Tout sélectionner
*a\Prenom = "Pierre "+Str(t)
*a\Nom = "Dupond"
*a\Age = 28
Code : Tout sélectionner
EnableExplicit
Global t.L, TimeDebut.q, TimeFin.q
Structure Employe
Prenom.s
Nom.s
Age.L
EndStructure
TimeDebut = ElapsedMilliseconds()
For t=1 To 200000
Define Societe.s = "PureBasic"+Str(t)
Define Service.s = "Commercial"+Str(t)
Define Employe.s = "Reference"+Str(t)
Define a.Employe
With a
\Prenom = "Pierre "+Str(t)
\Nom = "Dupond"
\Age = 28
EndWith
Next
TimeFin = ElapsedMilliseconds()
MessageRequester("Temps d'exécution", Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
Code : Tout sélectionner
Global t.L,TimeDebut.q,TimeFin.q
Structure Employe
Prenom.s
Nom.s
Age.L
EndStructure
Structure Service
; serv.s ; On peut ici placer des informations relatives aux services
Map Employe.Employe()
EndStructure
Structure Societe
; soc.s ; On peut ici placer des informations relatives aux sociétés
Map Service.Service()
EndStructure
Global NewMap Societ.Societe()
TimeDebut=ElapsedMilliseconds()
; chargement de la Map principale
;************ Début sociétés *************
For so=1 To 1000
; societ("so"+Str(i))\soc="soc"+Str(so)
societ("so"+Str(so))
; ************ Début services /sociétés ************
For se=1 To 10
societ()\Service("se"+Str(se))
; ************* Début employés /sosciétés/services ***********
For em=1 To 20
; societ()\Service()\Employe(Str(i)+Str(s)+Str(em))
societ()\Service()\Employe(Str(em))
societ()\Service()\Employe()\Age=28+em
societ()\Service()\Employe()\Nom="Dupond"+Str(em)
societ()\Service()\Employe()\Prenom="Pierre"+Str(em)
Next
Next
Next
timeFin=ElapsedMilliseconds()
Nbsoc=MapSize(societ())
nbserv=MapSize(societ()\Service())
nbemploy=MapSize(societ()\Service()\Employe())
Totalenr.l=Nbsoc*nbserv*nbemploy
MessageRequester("Temps d'exécution",Str(TimeFin-TimeDebut)+" ms"+Chr(10)+"nb societé="+Str(nbsoc)+Chr(10)+"NB service/soc ="+Str(nbserv)+Chr(10)+"Nb employé/service="+Str(nbemploy)+Chr(10)+"Nb Total="+Str(Totalenr),#MB_OK)
End
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(100000)
TimeDebut = ElapsedMilliseconds()
For t=1 To 200000
Define *a.Employe = AddMapElement(Societe("PureBasic"+Str(t))\Service("Commercial"+Str(t))\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("PureBasic9999")\Service("Commercial9999")\Employe("Reference9999")\Prenom + Chr(10)
TimeFin = ElapsedMilliseconds()
MessageRequester("Temps d'exécution", Controle + Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
Code : Tout sélectionner
Structure T
Map T.T()
ValS.s
StructureUnion
ValL.l
ValF.f
EndStructureUnion
EndStructure
Global NewMap TData.T()
With TData("PureBasic")\T("Commercial")\T("001")
\T("Prenom")\ValS = "Pierre"
\T("Nom")\ValS = "Dupond"
\T("Age")\ValL = 25
\T("Passe-temps")\T("Lecture")
\T("Passe-temps")\T("Randonnée")
EndWith
With TData("PureBasic")\T("Commercial")\T("002")
\T("Prenom")\ValS = "Paul"
\T("Nom")\ValS = "Martin"
\T("Age")\ValL = 29
\T("Passe-temps")\T("Voyage")
\T("Passe-temps")\T("Jeux vidéo")
EndWith
With TData("PureBasic")\T("Administratif")\T("003")
\T("Prenom")\ValS = "Jean"
\T("Nom")\ValS = "Moulin"
\T("Age")\ValL = 41
EndWith
With TData("PureBasic")\T("Technique")\T("004")
\T("Prenom")\ValS = "Fred"
\T("Nom")\ValS = "Leboss"
\T("Age")\ValL = 39
\T("Passe-temps")\T("Jeux vidéo")
EndWith
With TData("Microsoft")\T("Commercial")\T("001")
\T("Prenom")\ValS = "Nicole"
\T("Nom")\ValS = "Duchemin"
\T("Age")\ValL = 33
\T("Passe-temps")\T("Lecture")
EndWith
With TData("Microsoft")\T("Technique")\T("002")
\T("Prenom")\ValS = "Gérald"
\T("Nom")\ValS = "Durand"
\T("Age")\ValL = 38
EndWith
Global NewMap TSocietes.T()
Global NewMap TSocietesTotalAge.T()
Global NewMap TServices.T()
Global NewMap TServicesTotalAge.T()
Global NewMap TPasseTemps.T()
Debug "-----------------------------------"
Debug "Liste du personnel toutes sociétés confondues :"
ForEach TData()
Global Societe.s = MapKey(TData())
ForEach TData(Societe)\T()
Global Service.s = MapKey(TData(Societe)\T())
ForEach TData(Societe)\T(Service)\T()
Global Reference.s = MapKey(TData(Societe)\T(Service)\T())
With TData(Societe)\T(Service)\T(Reference)
Debug Societe + " : " + \T("Prenom")\ValS + " " + \T("Nom")\ValS + " " + Str(\T("Age")\ValL) + " ans (Réf : " + Reference + ")"
TSocietes(Societe)\ValL + 1
TSocietesTotalAge(Societe)\ValL + \T("Age")\ValL
TServices(Service)\ValL + 1
TServicesTotalAge(Service)\ValL + \T("Age")\ValL
EndWith
ForEach TData(Societe)\T(Service)\T(Reference)\T("Passe-temps")\T()
TPasseTemps(MapKey(TData(Societe)\T(Service)\T(Reference)\T("Passe-temps")\T()))\ValL + 1
Next
Next
Next
Next
Debug "-----------------------------------"
Debug "Âge moyen par société :"
ForEach TSocietes()
Debug MapKey(TSocietes()) + " : " + StrF( TSocietesTotalAge(MapKey(TSocietes()))\ValL / TSocietes()\ValL ) + " ans"
Next
Debug "-----------------------------------"
Debug "Âge moyen par service :"
ForEach TServices()
Debug MapKey(TServices()) + " : " + StrF( TServicesTotalAge(MapKey(TServices()))\ValL / TServices()\ValL ) + " ans"
Next
Debug "-----------------------------------"
Debug "Liste des passe-temps :"
ForEach TPasseTemps()
Debug MapKey(TPasseTemps()) + " : " + Str(TPasseTemps()\ValL) + " fois"
Next
Code : Tout sélectionner
Macro WithExtended(AssociatedStructure, Expression)
*InternalTemporaryPointor.AssociatedStructure = Expression
With *InternalTemporaryPointor
EndMacro
Je viens de tester les maps. Je découvre car je n'avais pas besoin des commandes natives pour les maps. Théoriquement, je ne m'attendais pas à des *100 en accélération, en augmentant la quantité de slots, juste à un *1.5 un *2 voire *3, mais là, c'est *1/75 !?!G-Rom a écrit : cela n'a pas d'impact sur le temps d’exécution , en l'augmentant considérablement
( x10 ) on triple les temps d'accès.