JeuWeb - Crée ton jeu par navigateur
[Résolu] Allocation de mémoire... ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Allocation de mémoire... ? (/showthread.php?tid=4367)

Pages : 1 2 3 4


[Résolu] Allocation de mémoire... ? - MaXOhBalle - 28-09-2009

Bonjour,

voilà je me demandais, niveau allocation de mémoire quelle était la meilleur méthode... (j'ai cherché sur le net et il n'y a quasiment aucune documentation par rapport à ce type de demande [qu'est-ce qui demande le plus de bits, etc.])

Imaginons une variable comme ceci

Code PHP :
<?php 
$machin_prout_boudin_youpi
= 'youpla';

et un tableau de type

Code PHP :
<?php 
$machin
['prout']['boudin']['youpi'] = 'youpla';

sachant que la plupart du temps le premier exemple sera appeler d'une manière du genre...

Code PHP :
<?php 
${'machin_'.$a.'_'.$b.'_'.$c.'};

... mais pas systématiquement Smile

Qu'est-ce qui appel le moins de bits ? Qu'est-ce qui demande le moins d'effort pour le serveur ? (c'est dans l'idée d'optimiser un peu mon code)

Même question (pendant que j'y suis) dans un autre code...

Code PHP :
<?php 
$mon_tableau
['yes']['choix1'] = 'prout1';
$mon_tableau['yes']['choix2'] = 'prout2';
$mon_tableau['yes']['choix3'] = 'prout3';
$mon_tableau['no']['choix1'] = 'bidule1';
$mon_tableau['no']['choix2'] = 'bidule2'; // Enfin vous avez compris le principe...
et

Code PHP :
<?php 
$mon_tableau
['choix1']['yes'] = '...';
$mon_tableau['choix1']['no'] = '...';
$mon_tableau['choix2']['yes'] = '...'; // Pareil

(Imaginons donc que $mon_tableau contienne en tout le même nombre de [] mais pas aux mêmes endroits)

Qu'est-ce qui est le plus lourd ? Avoir plus de ['declaration'] vers la racine du tableau ou vers l'extérieur de celui-ci ? Y a-t-il vraiment une différence ? (je me demande bien !)

Voilà, je ne suis pas sûr du vocabulaire utilisé puisque c'est un peu confus tout ça, mais j'espère que vous comprenez les idées Smile, qui sont evidemment utilisées de manière beaucoup plus complexe dans le code de mon projet, ça a donc son importance si l'une ou l'autre des solutions est beaucoup plus lourde pour le serveur Smile

Merci beaucoup pour les futures réponses, ce genre de question rôdent souvent dans ma tête et j'ai quasiment jamais de réponse par les documentations... (jamais aucune comparaison de ce type)


RE: Allocation de mémoire... ? - Allwise - 28-09-2009

Avant tout, je pense - on en a pas mal discuté sur un topic dédié aux optimisations - que ce n'est pas sur ce genre de choses qu'il faut passer du temps pour optimiser son application. Même dans une grosse application, le gain que ça t'apportera sera dérisoire, si tant est que ça t'en apporte un.

Il vaut mieux passer du temps à optimiser ses algorithmes dans leur fonctionnement, la structure de son application, mettre en cache les données lourdes à calculer / récupérer, bien gérer ses includes ( par exemple, préférer mettre un chemin absolu plutôt qu'un chemin relatif pour que PHP n'aille pas farfouiller dans tous les include_path pour trouver le fichier)...
Après si c'est pour la culture, tu peux connaître la mémoire utilisée par ton script avec la fonction get_memory_usage - j'en parlais aussi dans un autre topic -, et tu peux regarder l'opcode de tes scripts avec une extension PHP ( je n'ai pas le nom en tête ).

Concrètement, pour le 1er point ça prendra plus de place un tableau multidimensionnel qu'une variable avec un nom long. Dans le 1er cas on a plusieurs variables ( une par dimension ), dans le second on n'en a qu'une.
Pour le second point, c'est exactement la même chose.


RE: Allocation de mémoire... ? - My Hotel - 28-09-2009

Je pense qu'au niveau de l'optimisation, c'est ridicule de penser à ça, comme l'a bien expliqué Allwise.
Effectivement, les variables longues prennent légèrement moins de place qu'un array, mais franchement, qu'est-ce-qui est plus pratique?
Vu que utiliser l'un ou l'autre change pas la vitesse d'exécution, autant utiliser le plus confortable.

Sinon, la partie :
Citation :(Imaginons donc que $mon_tableau contienne en tout le même nombre de [] mais pas aux mêmes endroits)

Qu'est-ce qui est le plus lourd ? Avoir plus de ['declaration'] vers la racine du tableau ou vers l'extérieur de celui-ci ? Y a-t-il vraiment une différence ? (je me demande bien !)
, j'ai pas compris, désolé Wink

Bye


RE: Allocation de mémoire... ? - MaXOhBalle - 28-09-2009

Vous prenez pas mes questions dans le bon sens... Ok pour le 1er cas c'est logique que le array prenne plus de place à la base, mais l'appel de la var avec les {}, les '..' n'est-il pas plus long ? C'était juste ça...

Après tout ce que tu dis je le fais déjà (à part peut-être les caches que je préfére placer à la fin du dev des gros axes du projet).

Je connaissais pas get_memory_usage() et elle me sera utile.

Après dans l'idée, je doute que des 100ene voir des milliers de variables longues à côté de array à 4 dimensions n'ai qu'une légère différence au niveau du temps de calcul, de leur taille pour le serveur, etc... Tout comme j'ai découvert un jour qu'une variable de session mettait largement plus de temps à être remise en place qu'une variable globale redéfinie [ce qui n'est pas une comparaison avec ce que j'ai demandé mais un simple fait qui m'a fait réaliser l'impact des détails sur l'ensemble du code]

Enfin, il vaut tout de même mieux un code optimiser à mort, jusqu'à des détails qui vous paraissent aussi "ridicule" que ça pour être le plus performant et le plus clean possible... Je considèrais que ce n'était que chercher à m'améliorer pointilleusement ce que je me demandais..

Bon... merci tout de même..


RE: Allocation de mémoire... ? - Sephi-Chan - 28-09-2009

Même si je comprends la curiosité de savoir comment ça marche, mais je me demande ce que tu feras si tu découvres qu'un tableau est moins gourmand que des scalaires ? Tu vas transformer tout ton code pour répercuter ça ?

(28-09-2009, 06:16 PM)MaXOhBalle a écrit : Enfin, il vaut tout de même mieux un code optimiser à mort, jusqu'à des détails qui vous paraissent aussi "ridicule" que ça pour être le plus performant et le plus clean possible... Je considèrais que ce n'était que chercher à m'améliorer pointilleusement ce que je me demandais..

C'est précisément en optimisant ce genre de choses que tu risques de rendre ton code impossible à maintenir. Et là, même avec des évaluations de scripts à 3ms au lieu de 5ms (et à côté de ça, une connexion à la base de données te prendra 15ms), tu risques de le regretter. Smile

Cela dit, je n'ai pas d'élément de réponse (parce que je m'en fous), mais je ne peux que te conseiller de lire le code source de PHP pour mieux en comprendre les subtilités. Bien sûr, ça implique d'avoir de solides connaissances requises en C et en lecture de code.


Sephi-Chan


RE: Allocation de mémoire... ? - Ter Rowan - 28-09-2009

je n ai pas moyen de vérifier ce que je dis plus que cela mais ...


matrice (tableau de tableau) meilleur que variableAvecUnNomComposéDeCinquanteVariableAConcatenerOupsJAiOubliéUnSAVariables

- parce que la concaténation te coutera des calculs donc probablement plus de temps
- parce que l'information, humainement, est plus modélisée par tableau (sinon tu n'aurais pas à faire des .$a.$b. ...)
- parce que pour passer des paramètres, ca va être plus facile avec des tableaux plutôt qu'avec n variables (surtout si tu rajoutes une entrée à $b par exemple)

etc...


RE: Allocation de mémoire... ? - Gwym - 28-09-2009

(28-09-2009, 05:06 PM)MaXOhBalle a écrit : Bonjour,

voilà je me demandais, niveau allocation de mémoire quelle était la meilleur méthode...

Bonjour,

Je n'ai pas bien compris, tu commences par parler de mémoire et de nombre de bits (donc de place ??) et dans ta réponse suivante tu parles de temps ?

Si tu veux une réponse approximative pour le temps d'exécution, mets simplement les différentes méthodes dans des boucles de 10000 iterations, mesure le temps et prend la plus rapide, non ?

Car je pense qu'il est difficile de répondre dans l'absolu, puisque c'est... variable ! (Exemple des stats si tu veux t'amuser : http://phplens.com/benchmark_suite/)
Version PHP, machine, autres applis tournant, etc...

La prochaine fois que ton PHP sera mis a jour il te faudra vérifier si ça n'a pas changé, vérifier dans différentes conditions pour voir les influences, etc...

Pour ta culture personnelle ou si tu constates un écart très important et que tu utilises cela des milliers de fois par requête, ça peut être interessant, mais sinon... Confusediffle:


RE: Allocation de mémoire... ? - zeppelin - 29-09-2009

Pour moi les arrays sont bien meilleures... Au moindre calcul tu es gagnant (imagine les explodes sur _ :-p, unset dans une boucle car tu ne peux pas effacer directement la 3ème dimension sur 5...).

Aussi à partir de 5 dimensions je me demande si ta structure est bien correct... j'ai rarement eu besoin de plus de 5 dimensions!

Pour moi l'erreur est la: Si tu utilise la concaténation ("," est plus rapide que "." par ailleurs, bien que j'utilise toujours ".") pour des variables dynamiques, c'est que tu ne veux que lire leurs valeurs (à la moindre modif l'array l'emporte haut la main sinon). Si ton unique but est de lires des valeurs, ces valeurs ne doivent pas êtres dans des variables, si déjà un dans fichier xml ou une bdd.

Bref peu-être je me trompe complétement, mais la j'ai beau chercher , je ne comprends pas l'utilité de la chose... Je t'encourage à poster le code ou tu as besoin de ceci pour qu'on puisse réfléchir si c'est effectivement la solution correcte!

ryan


RE: Allocation de mémoire... ? - naholyr - 29-09-2009

Quantités de méconnaissances et d'approximations dans ce fil de discussion. Sincèrement, arrêtez de vouloir couper les cheveux en 4 ! On fait ça quand on a une parfaite connaissance des méandres d'un langage, et au moins une application déjà totalement fonctionnelle...

Là on dirait une discussion d'experts dans une série télé :?


RE: Allocation de mémoire... ? - MaXOhBalle - 29-09-2009

Sephie-Chan, c'est justement parce que j'ai utilisé la méthode ${$a.$b} dés le départ que je me demandais s'il ne valait pas mieux des array (ce qu'il vaut mieux changer avant que le projet soit trop avancé); si les scalaires sont plus rapides, autant rester sur cette base. Je précise que j'ai pas plus de difficulté que ça à m'en sortir (niveau clarté) avec ce que je fais en ce moment donc c'est pas la question.

Gwym, je me suis mal expliqué au début (enfin je me suis emmêlé plutôt) je cherchais uniquement à savoir ce qui prenait le plus de temps à "récupérer" pour le serveur (à l'exécution), étant donné que niveau place c'était équivalent (à peu pret)

Pour les autres, je suppose que pour des manipulations lourdes les array sont evidemment beaucoup plus pratique, mais je ne suis pas sûr d'en faire.

J'ai préféré faire des require() avec des fichiers type 'config.php' contenant plein de variables genre machin = 'bidule'; que des fichiers externes chargés et traités; puisque en toute logique (enfin dans ma logique, je peux me tromper) un fichier XML ou autre sera plus complexe, plus lent a traiter et ça reviendrait exactement au même (en moins rapide & moins clair pour moi au final).

Pour moi (je me repete), savoir toutes les différences de rapidité d'exécution permet d'avoir une bien meilleur connaissance des bases du langage, donc du langage en lui-même et au final pouvoir programmer plus efficacement & dans une logique plus claire (choisir une méthode plutôt qu'une autre naturellement, plutôt que tout mélanger et que se soit pas clair)

J'espere m'être bien expliqué Smile (PS: il est tôt, j'ai la tête dans les fesses, on peut dire)