JeuWeb - Crée ton jeu par navigateur
Principes de base d'optimisation - 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 : Principes de base d'optimisation (/showthread.php?tid=358)



Principes de base d'optimisation - Maegia - 24-10-2006

Bonjour ! Puisque les gens semblent de plus en plus nombreux à se lancer dans la programmation de jeu PHP sans pour autant en avoir nécessairement l'expérience, je crois qu'il pourrait être bon de leur enseigner quelques principes de base ayant pour objectif d'optimiser la rapidité d'exécution de vos scripts. Bien évidemment, je ne ferai pas le tour de la chose, mais je tenterai d'expliquer les bases, ce à quoi tout débutant aura à se frotter dès le départ.

ECHO

C'est bien connu, lorsqu'on désire afficher quelque chose à l'écran, on utilise la fonction echo. Il existe deux manières de le faire, soit les suivantes :

Code PHP :
<?php 
echo 'TEST';
echo
"TEST";

À première vue, les deux manières sont similaires, ou du moins, elle donne le même résultat. Vous avez bien raison... Et même en répétant le echo plus de 10,000 fois dans une itération, les deux temps de chargement seront très similaire. Mais qu'en est-il lorsqu'on y inclut une variable ? Les deux exemples deviennent donc :

Code PHP :
<?php 
echo 'TEST : '.$MA_VARIABLE;
echo
"TEST : $MA_VARIABLE";

En répétant l'opération quelques centaines de fois à peine, on commence déjà à voir un léger avantage en faveur de la première option. En effet, l'utilisation du "simple quote" facilite l'affichage en ce sens que PHP, lorsque face à une variable, ne tente pas de la traiter. Il l'affiche, simplement. En revanche, en utilisant les "double quotes", PHP fait une première lecture de la phrase à afficher, y interprète d'abord les variables pour ensuite, finalement, relire la phrase en affichant le tout. Bon, qu'on ne se le cache pas, dans un tel exemple, on peut sauvé environ... 0,005 sec ? Cela dit, cette connaissance revêt toute son importance lorsqu'on est, par exemple, confronté à un script qui gère un combat complexe, ou l'attaque de chaque "créature" doit être afficher à l'écran, avec ses points de vie restant, les dégâts infligés, etc, le tout durant tout un combat pouvant inclure des centaines et des centaines de lignes. En ce sens, afin d'optimiser au maximum ses scripts, il serait beaucoup plus judicieux d'utiliser la techique suivante :

Code PHP :
<?php 
while ($condition){
    echo 'TEST : '.$premiere_variable.' et '.$deuxieme_variable;
}

plutôt que :

Code PHP :
<?php 
while ($condition){
    echo "TEST : $premiere_variable et $deuxieme_variable";
}

LES VARIABLES

Déclarer une variable, ça prend de la mémoire. Ainsi, lorsqu'une variable porte pour nom $MA_VARIABLE_QUE_JAIME_BEAUCOUP, elle prend beaucoup plus de mémoire qu'une variable nommé, par exemple, $VAR. Bref, sans faire 11 millions d'exemples, il suffit simplement de se rappeler que de minimiser au maximum le nom des variables, tout en restant bien sûr le plus clair possible dans nos codes, on optimise le temps d'exécution de nos scripts.

Encore mieux ? Évitez de déclarer des variables qui ne serviront qu'une seule fois. Je vois beaucoup de gens qui, par exemple, pour afficher des résultats mathématiques, procéderons de la manière suivante :

Code PHP :
<?php 
$x
= 5;
$y = 5;
$resultat = (($x + $y) / 5);
echo
"Mon résultat est : $resultat !"

Alors que, tel que mentionné dans les deux paragraphes précédants, il serait beaucoup plus judicieux de procéder ainsi :

Code PHP :
<?php 
echo 'Mon résultat est : '.((5 + 5) / 5).' !';

Vous devez aussi savoir qu'en utilisant le simple quote, vous pouvez inclure vos fonctions à même votre echo, sans définir d'autres variables. Un bel exemple pourrait être :

Code PHP :
<?php 
echo 'Mon résultat est : '.number_format(((5 + 5) / 5), '2', ',', '.').' !';

LES REQUÊTES SQL

J'ai un secret pour vous... Plusieurs requêtes SQL alors qu'on aurait pu n'en faire qu'une seule, c'est mal. Très mal. En ce sens, il vous fait savoir qu'ici aussi, l'optimisation est très importante. Je ne passerai pas par quatre chemins : L'essentiel a été dit dans les deux articles précédants, soit qu'il est important de minimiser au maximum la déclaration des variables et que l'utilisation des "simple quote" était plus efficace, en ce sens, à la place de :

Code PHP :
<?php 
$declaration
= "SELECT nom FROM ma_table WHERE id = '$id'";
$requete = mysql_query($declaration);
$resultat = mysql_fetch_array($requete);

Nous ferions beaucoup mieux d'utiliser ceci :

Code PHP :
<?php 
$req
= mysql_query('SELECT nom FROM ma_table WHERE id = "'.$id.'"');
$dat = mysql_fetch_array($req);

Vous noterez l'utlisation des doubles quotes aux côtés des simple quote, dans mon exemple précédent. Il s'avère en effet que certaines versions de mySQL les réclament, simplement.

Notez que dans les exemples futurs, je prendrai en considération que l'utilisation des simple quote ainsi que la minimisation des variables est aquises.

Il est important d'éviter les requêtes inutiles... En ce sens, ceci :

Code PHP :
<?php 
$req
= mysql_query('SELECT id FROM ma_table');
$nbr = mysql_num_rows($req);

mysql_query('UPDATE ma_table SET nombre_joueurs = "'.($nbr + 1).'"')

Vous pouvez procéder de la manière suivante :

Code PHP :
<?php 
mysql_query
('UPDATE ma_table SET nombre_joueurs = nombre_joueurs + 1');

Maintenant, est-il préférable d'utiliser mysql_fetch array() ou mysql_fetch_row ? Certains dirons que c'est futile, mais l'utilisations du mysql_fetch_row accélèrera en effet de quelques milisecondes l'efficacité de vos scripts puisqu'il ne crée pas d'index pour chaque élément du tableau. Cela dit, la différence reste négligeable, et il vous faudra savoir que si vous désirez ajouter un élément au beau milieu de votre requête, tous vos index numériques seront donc décalé... Cela dit, puisqu'il est ici question d'optimisation et que l'optimisation ne fait pas la différence entre un gain de 0,001 sec et d'un gain de 1 sec, je vous conseillerai donc le mysql_fetch_row(). Voici deux exemples :

mysql_fetch_row() -> Index numérique
Code PHP :
<?php 
$req
= mysql_query('SELECT id, nom, email, password FROM ma_table WHERE id = "'.$id.'"');
$dat = mysql_fetch_row($req);

$id = $dat[0];
$nm = $dat[1];
$em = $dat[2];
$pa = $dat[3];

mysql_fetch_array()
Code PHP :
<?php 
$req
= mysql_query('SELECT id, nom, email, password FROM ma_table WHERE id = "'.$id.'"');
$dat = mysql_fetch_array($req);

$id = $dat['id'];
$nm = $dat['nom'];
$em = $dat['email'];
$pa = $dat['password'];

On veut aller encore un peu plus loin ? Mes deux exemples précédents sont à l'image de ce que je vois souvent, soit une redéclaration de variable qui pourtant avaient déjà été créé une première fois lors de l'appel à la fonction mysql_fetch_row() ou mysql_fetch_array. Pourquoi les redéfinir encore ? Ainsi, à la place de :

Code PHP :
<?php 
$req
= mysql_query('SELECT id, nom, email, password FROM ma_table WHERE id = "'.$id.'"');
$dat = mysql_fetch_row($req);

$id = $dat[0];
$nm = $dat[1];
$em = $dat[2];
$pa = $dat[3];

echo
'Mon joueur se nomme '.$nm.' et mon password est '.$pa.' !';

Ne serait-il pas préférable, en utilisant les principes déjà appris, de procéder plutôt ainsi ?

Code PHP :
<?php 
$req
= mysql_query('SELECT id, nom, email, password FROM ma_table WHERE id = "'.$id.'"');
$dat = mysql_fetch_row($req);

echo
'Mon joueur se nomme '.$dat[1].' et mon password est '.$dat[3].' !';

Bien sûr, je n'ai pas la science infuse. Il se peut que quelques erreurs se soient glissées dans cet articles, mais il se base sur une longue expérience ainsi que sur une série de tests. Je suis aussi loin de couvrir l'ensemble des principes d'optimisations, mais je crois cependant que ces quelques exemples pourront néanmoins vous servir pour la création de votre futur jeu optimisé ! Wink

Bonne lecture !


RE: Principes de base d'optimisation - orditeck - 26-10-2006

L'aide pour ce tutoriel ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=550