Optimise ton script ...
L'optimisation n'est pas évidente.
Peux t on grouper en mysql un envoi de requetes ?
En fait mon script fais 60 fois la meme étape (calculs divers) pour à chaque fois faire un update d'une ligne d'une table (ligne différente à chaque fois)
Peut etre serait il possible d'atttendre d'avoir toutes les requetes pour les envoyer en une fois à la base ?
Tu peux faire un copie colle de ton script ici qu'on voye ce qu'il y a a optimiser ?
J'ai eut besoin il y a quelques jours de tester si la solution utilisant MySQL était plus rapide que la solution utilisant PHP.
Ma question était de tester si une ligne existait dans une table. Il ne pouvait y avoir au maximum qu'une seul ligne.
Donc vallait-il mieux sélectionner la ligne et tester son existance avec mysql_num_rows(), ou alors utiliser la fonction COUNT() de MySQL, puis ensuite récupérer un tableau avec mysql_fetch_array puis en extraite la valeur voulue ?
Pour répondre à cette question j'ai réalisé un benchmark
Résultat (pour ma machine) : une moyenne de 22 ms pour le mysql_num_rows contre 15ms pour COUNT.
(Pour ce test j'ai réalisé 100000 itérations allant de la requête jusqu'a la récupération concrète du nombre de ligne.)
Maintenant ça peut parraitre un peu bêtat de dire que c'est plus rapide en utilisant les fonction de mysql, mais à l'origine cette question ne m'a pas parru évidente.
Je pense donc que ceci est généralisable à la plus part des cas : préférer la solution MySQL lorsque vous avez le choix entre une solution MySQL et PHP.
J'en profite pour poser une petite question : vaut-il mieux stoquer dans une bdd les dates sous formes d'unix timestamp (dans un champ de type INT) ou un des formats de date de mysql ?
Si tu utilises le format DATE de MySQL, tu pourras faire un grand nombre de calcul directement via MySQL. Et si besoin, tu pourras quand même récupèrer le timestamp UNIX, via la fonction MySQL dédiée à cela.Envoyé par Celelibi
Par contre si tu stockes en timestamp, tu vas être fortement limité question calculs, et un grand nombre de taches risque d'etre relégué à PHP.
DATETIME plutot non ?
Sinon tu perd les infos heures/minutes/secondes
La doc mysql est ton amie aussi, très intéressante je trouve :
http://dev.mysql.com/doc/mysql/en/da...functions.html
Existe même en francais :]
http://dev.mysql.com/doc/mysql/fr/da...functions.html
Bonsoir,
Si je veux accèder à n données, uniques, mais accèdées à chaque execution d'un script, vaut il mieux créer une table mysql rien que pour stocker ces n données, ou utiliser un fichier à la place ?
Ou un genre de schéma similaire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 $Variables = file('variables'); ... $v_i = $Variables[i]; ... $Variables[m] = $v_m; ... $Fichier = fopen('variables','a'); fwrite ($Fichier, join("\n", $Variables)); fclose($Fichier);
Si tu utilises énormément de SELECT de ton fichier (c'est à dire de lecture) et que tu utilises relativement peut d'écriture (UPDATE, INSERT) je te conseil de passer par un fichier, mais stoque ces fichiers sous forme de tableau PHP avec var_export().
Par exemple :
Un simple include() et hop le tour est joué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php $ary = array( 0 => array( 'champ1' => 'valeur1', 'champ2' => 'valeur2' ), 1 => array( 'champ1' => 'valeur1', 'champ2' => 'valeur2' ), 2 => array( 'champ1' => 'valeur1', 'champ2' => 'valeur2' ), ); ?>
A part ça j'ai effectué un benchmark qui m'a largement surpris. J'ai fait une fonction de test qui recoit de trois facon un tableau de 1000 éléments. Il recoit ce tableau en paramètre lors du premier test, lors du second test en global, lors du troisième par référence.
Je fais une itération de 10000 tour avec appel de fonction, le résultat est sans appel :
passage du tableau en argument : 5.0572290420532 secondes
passage par globalisation : 0.026066064834595 secondes
Passage par référence : 0.024504899978638 secondes
Voici le code utilisé pour le passage en argument :
J'en conclu qu'il faut fortement éviter de passer des grosses données par argument à sa fonction (ce qui parait logiquie car toute la mémoirre alouée pour cet élément est passée à la fonction).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <?php include('function.php'); include('class_benchmark.php'); $ary = array(); for ($i = 0; $i < 1000; $i++) { $ary[$i] = $i * $i; } function test($ary) { $ary[0]++; } $bench = new bench(); for ($i = 0; $i < 10000; $i++) { test($ary); } $bench->finish(); ?>
J'ai du mal m'exprimer. Je voulais dire n variables :
Variable 1
Variable 2
...
Variable n
qu'on peut coder en mysql comme une table avec deux champs "Nom Variable" et "Valeur" (ou en une seule ligne ^^ mais c'est pas beau)
effectivement, c assez impressionant ..Envoyé par dark_genova
??Envoyé par dark_genova
C'est surtout parce que dans une fonction, PHP travaille sur des copies des variables passées en paramètre (donc si tu passes un bon gros tableau en paramètre, PHP va devoir le copier)
Salut,
j'ai une question qui me turlupine :
Dois-je systématiquement activer la compression GZip ? Je voudrais savoir si elle correspond à un type de sites particuliers, ou bien si elle est efficace dans tous les cas ?
Je suis en train de faire un projet à la SPIP, et je me demande simplement si je dois faire une constante GZIP pour activer ou non la compression HTTP...
Merci de votre aide.
Pourquoi alors ne pas travailler qu'avec des référence ?
Est-ce un reflexe à prendre ?
A chaque tour dans la boucle tu calcule leEnvoyé par iubitoalors en le sortant avant la boucle tu le calcule une fois pour toutes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sizeof($arr)
Au bout de la boucle tu aurra economisé du temps...
oui mais il arrive qu'on ne veuille pas les deux premières cases du tableau...dans ce cas un for est bien pratique.
Si j'ai deux tables A et B, et je veux selectionner des enregistrements de A, et quelques enregistrement de B associés. Du style
Vaut il mieux faire réelement la jointure externe, ou vaut il mieux tout rappattrier par une jointure interne, et trier après ce que je garde ou non dans chaque enregistrement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT ... FROM A LEFT OUTER JOIN B ON A.Id = B.Id AND A.Cle = 'Constante'
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT ... FROM A JOIN B ON A.Id = B.Id
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $Enregistrement = mysql_fetch_array(); if ($Enregistrement[Cle] == 'Constante') ... else ...
Bonjour,
Interessant ce sujet. Je l'ai trouvé en cherchant justement quel était le plus rapide entre un while et un foreach.
J'ai beaucoup vu que vous parliez de libérer la mémoire du server, mais celà se fait au détriment du CPU non ?
Donc faut il vraiment détruire les variables temporaires à chaque fois, et libérer les résult Mysql, ce qui libère de la mémoire mais utilise le CPU à chaque appel de fonction ?
J'apporte ma pierre à l'édifice. Enfin... Disons mon petit caillou plutôt, mais c'est l'intention qui compte ^^ :
Lorsque vous devez compter un nombre d'enregistrement d'une table compotant un champ 'id', et que cette table ne subit jamais d'effacement (table contenant chaque connection au site par exemple, pour faire un compteur avec stats sur le pays etc.) plutôt que de faire un Where 1 et compter le nombre de lignes retournées, faites un Where 1 order by id desc limit 0,1
L'id retourné est le dernier et correspond au nombre d'enregistrement puisque dans ce genre de table aucun n'est supprimé. Donc un seul enregistrement retourné au lieu de tous.
Il est très difficile de faire les bons tests de rapidités. Beaucoup de tests sur internet montrent que pour charger le contenu d'un fichier la fonction file_get_content est la plus rapide. En pratique, fgets peut être de 20 % plus rapide à infiniement plus long suivant les paramètres. 20 % sur le chargement d'un gros fichier, ce n'est pas rien.
Il y a toujours un tas de paramètres que l'on oublie, et l'optimisation n'est pas simple. Le pire est qu'elle dépend avant tout de la machine sur laquelle le script tourne. D'une machine à l'autre, d'une configuration à l'autre, les meilleures solutions ne seront pas toujours les mêmes.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager