JeuWeb - Crée ton jeu par navigateur
Manière d'alléger son code - 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 : Manière d'alléger son code (/showthread.php?tid=2055)

Pages : 1 2 3 4


RE: Manière d'alléger son code - MyHeadXplod - 25-11-2007

Citation :*sens comme des sarcasmes*

Je ne pense pas avoir dis une vérité mais plus mon opinion sur le sujet.

J'ai forgé mon opinion en ayant vu plusieurs sites de benchmark (au passage les résultats sont des fois trés différents d'un site à l'autre) .
De plus pour avoir testé en local différentes options de code j'ai constaté que les méthodes de bouclage dépendent du nombres d'enregistrements à parcourir.

Pour illustrer mes propos voici un site de benchmark http://iubito.developpez.com/php/bench.php?test=foreach (encore une fois je ne donne que mon point de vue et ce n'est pas une vérité générale)

A bientot,

Non mais vérité ou opinion peu importe, le tout c'est d'expliquer pourquoi tu dis ça Smile

Citation :Pour comprendre le pourquoi du comment il faut ausculter le moteur PHP, et pour ça il faut avoir un bagage que personne n'a ici.
Tout ce qu'on peut affirmer, c'est que les benchmarks prouvent ceci ou cela.
Et en PHP5 j'affirme que foreach() est toujours plus rapide que le while, et en tous cas il est toujours infiniment plus lisible

Ok ok, ça c'est clair Smile

thx à vous deux


RE: Manière d'alléger son code - Joojo - 25-11-2007

En regardant mon script messagerie.php j'ai remarqué que vous envoyé un message à tous mes membres j'ai mit une requête dans un while qui s'exécutera pour chaque membres. Alors si j'ai 100 membres elle s'executera 100 fois. Hu Hu je suis un dingue. Big Grin Faut que j'aille modifier ça.


RE: Manière d'alléger son code - naholyr - 25-11-2007

Si si, les INSERT multiples ça marche très bien :

Code :
INSERT INTO table (champ1, champ2) VALUES (val11, val21);
INSERT INTO table (champ1, champ2) VALUES (val12, val22);
INSERT INTO table (champ1, champ2) VALUES (val13, val23);
deviendra
Code :
INSERT INTO table (champ1, champ2) VALUES (val11, val21), (val12, val22), (val13, val23);
Et question vitesse, ça roxe Wink


RE: Manière d'alléger son code - Sephi-Chan - 25-11-2007

oxman a écrit :Je préfère faire une boucle sur ma requête, je trouve ça plus propre :o)
Plus lourd aussi.

Tu irais plus vite en construisant la chaîne de la requête dans un premier temps et en t'en resservant dans l'INSERT.


Sephi-Chan


RE: Manière d'alléger son code - Kassak - 25-11-2007

Tient je pense que je vais faire comme cela maintenant, car plein de fois j'ai du mettre une requête dans une boucle, je savais que c'était pas top moumoute, mais je ne voyais pas trop comment faire autrement.


RE: Manière d'alléger son code - Zamentur - 26-11-2007

MyHeadXplod a écrit :Dans le cadre de vos jeux vous bosser sur des trucs énormes à ce point là? oO
Oui, l'exemple type c'est la creation d'un gps global pour les jeux qui se deroule sur une carte...
Au depart sur Ragol, on avais d'ailleurs un gps qui creer 30 minute à se charger, aujourd'hui c'est 4 secondes (ce qui est lmargement plus abordable)

Et il ya eu plusieurs fois ce sujet dans le forum d'aide à la programmation!

Donc les requetes à l'interieur des boucles faut faire très attention...


Il y a un trucs qui n'a pas était cité: la creation de clef dans chaque tables de la bdd!
C'est à mon sens incontournable, le jour ou j'ai compris que j'avais oublié de mettre 3 clef sur la table map j'ai accéléré le jeu d'1/4 de temps de génération (en 3 clics!) Cool


RE: Manière d'alléger son code - naholyr - 26-11-2007

Et puis un projet de jeu peut être plus ou moins gros, mais effectivement ça peut aller jusqu'à l'énorme.
Et surtout c'est du code qui sera maintenu pendant des années : faire l'impasse sur la lisibilité c'est prendre un très gros risque. C'est pour ça que perso, je ne ferais pas ce sacrifice.


RE: Manière d'alléger son code - X-ZoD - 27-11-2007

je suis daccord avec tous les dire de naholyr
il faut aussi prendre en compte le fait que ton code peut être repris par quelqu'un ... même par toi des années plus tard
les boucles avec des requetes ? --> oh my god
un while plutot qu'un foreach ? --> pourquoi? le foreach est plus facile a comprendre et ne serait ce que pour la fainéantise il est plus facile a taper mdr

pour ma part .... le principe de base d'un code php est le suivant
Citation :- ouverture sql
- requetes sql
- fermeture sql

- traitement des resultats de ces requetes
- html avec les affichage des traitement si besoin (echo par exemple)

d'autres choses
Citation :-> éviter le plus possible les if car ca ralenti le traitement de votre code ... préférer les tableaux indexés
-> minimiser les requetes sql.... c'est a dire comme dans l'exemple précédemment cité des insert, récupérer si possible toutes les informations dont on a besoin en une seule requete (jointures, alias, imbrications, etc ...), en principe aucun probleme si les tables sont bien faites,sinon pensez a optimiser vos tables
-> le stockage d'information dans la db n'est pas une solution automatique, par exemple si vous avez un annuaire avec des categorie et une image symbolisant chacune d'entre elles. Plutot que de faire une table avec le nom (ou l'id) des categories et les path des images qui les concerne, vous pouvez creer des images dont le nom sera les même que celles de ces catégorie et ainsi vous saurez quelles images afficher
du coup,
connection sql
+ recuperation des noms des images
+ fermeture sql
+ affichage des images
= 4 actions
alors que vous pouriez tout simplement faire
affichage des images portant les meme noms que les catégories
= 1 action
alors bien sure c'estun exemple pouri mais vous avez surement compris l'idée

sinon des infos pratiques qui peuvent aider
Citation :pour ceux qui ne savent pas on peut introduire un select dans un insert ... c'est à dire eviter ca:
*je recupere le nom de clan de bob
*je creer un nouveau user avec ce nom declan que je vient de recuperer
et avoir ca :
*je creer un nouveau user dont la valeur du champ "clan" sera le meme que celui de bob

je vous ferai la syntaxe plus tar sur demande pour ceux qui en ont besoin la jai la flemme

et ne pas oublier ... parfois on fait des trucs alors que des fonctions deja toute faites existent, n'ayez pas la fainéantise de jeter un oeil sur google pour savoir si ce que vous aller faire n'existe pas deja sous la forme d'une fonction... ca ne vous coute rien et vous vous coucherez moins con
je fait allusion a des fonctions sql du genr NOW() ou GET_LAST_ID() par exemple ou d'autres en php ... mais je vais vous faire une liste non plus Big Grin


RE: Manière d'alléger son code - MyHeadXplod - 27-11-2007

Je suis d'accord pour les requêtes dans les boucles et pour les clés à chaque table. Je n'ai jamais fais ce genre de connerie.

En fait j'ai toujours peur de faire un truc qui rame, donc j'ai toujours tendance à vouloir optimiser dans ce sens là quit à perdre en lisibilité... Cependant vu que je suis en train de remettre tout le code de mon jeu en forme je vais suivre vos conseils et essayé d'améliorer la lisibilité.

En ce qui concerne le foreach() j'ai toujours parcouru mon tableau de résultats de cette façon : while($ligne = mysql_fetch_array($resultat))

Du coup quand je vois ce bout de code je sais que je parcourt un tableau de résultat. Niveau lisibilité ça me convient donc... Mais bon c'est possible que ce soit moins lisible pour quelqu'un qui ne connait pas mon code.


RE: Manière d'alléger son code - naholyr - 27-11-2007

Mais... est-ce que vous savez seulement ce que vous faites quand vous tapez "while ($ligne = mysql_fetch_array($resultat))" ?
J'ai vraiment peur que non, car déjà jean-baptiste confond, mais là ça a l'air d'être à nouveau confus pour quelqu'un d'autre...

Voici les informations que vous DEVEZ savoir pour comprendre la signification du bout de code que vous utilisez tous les jours :
  • mysql_fetch_array($resultat) est un appel de fonction, qui renvoie FALSE s'il n'y a plus de ligne dans le résultat de la requête. Et sinon elle renvoie un tableau (au passage, utilisez mysql_fetch_assoc() qui renvoie un tableau associatif, c'est beaucoup plus pratique).


  • Un tableau non vide, converti en booléen, c'est TRUE.


  • Une affectation ($a = $b) a pour valeur la valeur affectée (($a = $b) == $b est TRUE).

Donc quand on exécute
Code :
while ($ligne = mysql_fetch_assoc($res)) {
   ...
}
C'est exactement équivalent à
Code :
$ligne = mysql_fetch_assoc($res);
while ($ligne != FALSE) {
  ...
  $ligne = mysql_fetch_assoc($res);
}

Vous comprenez bien qu'un foreach n'a RIEN à faire là dedans, on ne parcourt pas un tableau mais les lignes d'un résultat de requêtes, qui ne sont accessibles que l'une après l'autre via les fonction mysql_fetch_*().

C'est absolument le même fonctionnement que quand on parcourt avec fgets() les lignes d'un fichier.


J'espère avoir un peu éclairci les choses :/