Optimisation d'un code PHP
Les boucles : For et While
Code de test des boucle For :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
}
$time_end = microtime_float();
$duration_for_loop = $time_end - $time_start;)
?>
Code de test des boucle While:
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$i = 0;
$boucle_active = true;
$time_start = microtime_float();
while ($boucle_active)
{
if($i>=$nombre_boucle){$boucle_active=false;}
$i++;
}
$time_end = microtime_float();
$duration_while_loop = $time_end - $time_start;
?>
Résultat pour 500000 boucles sur 5 essais:
La boucle For :
0,0396s
0,0396s
0,0404s
0,0407s
0,0386s
Moyenne = 0,0398s
La boucle While :
0,0443s
0,0435s
0,0441s
0,0446s
0,0439s
Moyenne = 0,0441s
Conclusion :
La boucle For est 10% plus performante que la boucle While dans cette exemple.
Assignation des variables : 'x' et "x" :
Code de test des variable 'x' :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = 'blablabla';
}
$time_end = microtime_float();
$duration_variable_01 = $time_end - $time_start - $duration_for_loop;
?>
Code de test des variable "x" :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = "blablabla";
}
$time_end = microtime_float();
$duration_variable_02 = $time_end - $time_start - $duration_for_loop;
?>
Résultat pour 500000 boucles sur 5 essais:
Assignation des variables 'x' :
0,0436s
0,0462s
0,0424s
0,0418s
0,0459s
Moyenne = 0,0440s
Assignation des variables "x" :
0,0452s
0,0435s
0,0415s
0,0419s
0,0466s
Moyenne = 0,0438s
Conclusion :
L'assignation des variables "x" à une performance équivalente à l'assignation des variables 'x'.
Lecture d'un fichier texte : file_get_contents et fopen-fget :
Ce test va être réalisé en 2 parties : lecture d'un fichier texte d'une ligne et lecture d'un fichier texte de 10 lignes.
Code de test de lecture d'un fichier texte d'une ligne avec file_get_contents :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$time_start = microtime_float();
$nom_fichier = "montexte.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = file_get_contents($nom_fichier);
}
$time_end = microtime_float();
$duration_file_get_contents = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte d'une ligne avec fopen-fget :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$ma_variable = "";
$time_start = microtime_float();
$nom_fichier = "montexte.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$fp = fopen($nom_fichier,"r");
while(!feof($fp))
{
$ma_variable .= fgets($fp,4096) . "n";
}
fclose($fp);
}
$time_end = microtime_float();
$duration_fopen = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte de 10 lignes avec file_get_contents :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$time_start = microtime_float();
$nom_fichier = "montexte10.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = file_get_contents($nom_fichier);
}
$time_end = microtime_float();
$duration_file_get_contents_all = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte de 10 lignes avec fopen-fget :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$ma_variable = "";
$time_start = microtime_float();
$nom_fichier = "montexte10.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$fp = fopen($nom_fichier,"r");
while(!feof($fp))
{
$ma_variable .= fgets($fp,4096) . "n";
}
fclose($fp);
}
$time_end = microtime_float();
$duration_fopen_all = $time_end - $time_start - $duration_for_loop;
?>
Résultat pour 10000 boucles sur 5 essais :
Lecture d'un fichier texte d'une ligne avec file_get_contents :
0,5492s
0,5503s
0,5395s
0,5420s
0,5610s
Moyenne = 0,5484s
Lecture d'un fichier texte d'une ligne avec fopen-fget :
0,5131s
0,5070s
0,5063s
0,5039s
0,5162s
Moyenne = 0,5093s
Lecture d'un fichier texte de 10 lignes avec file_get_contents :
0,5525s
0,5466s
0,5499s
0,5463s
0,5559s
Moyenne = 0,5502s
Lecture d'un fichier texte de 10 lignes avec fopen-fget:
0,6697s
0,6527s
0,6522s
0,6523s
0,6530s
Moyenne = 0,6560s
Conclusion :
Lors de la lecture d'un fichier texte d'une ligne, la combinaison fopen-fget est plus performante de 7% que la fonction file_get_contents alors que la lecture d'un fichier texte de 10 lignes à l'effet inverse, la fonction file_get_contents est plus performante de 16% que la fonction combinaison fopen-fget.
Infuance des variables sur le code:
Ce test consiste à voir la différence entre la définition de plusieurs variable contre un seul pour obtenir le meme résultat.
Code de test à plusieurs variables :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$val01 = 5;
$val02 = 3;
$val03 = 6;
$val04 = 2;
$val05 = 9;
$val06 = $val01*$val02;
$val07 = $val06/$val03;
$val08 = $val07^$val05;
$val09 = $val08/$val04;
$val10 = $val09^$val07;
}
$time_end = microtime_float();
$duration_val01 = $time_end - $time_start;
?>
Code de test à une variable :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$val10 = (((5*3/6)^9)/2)^(5*3/6);
}
$time_end = microtime_float();
$duration_val01 = $time_end - $time_start;
?>
Résultat pour 50000 boucles sur 5 essais :
Test à plusieurs variables :
0,2962s
0,2921s
0,2943s
0,2985s
0,2941s
Moyenne = 0,2950s
Test à une variable :
0,1650s
0,1621s
0,1653s
0,1659s
0,1660s
Moyenne = 0,1648s
Conclusion :
Le test montre une énorme perte de performance lors de l'utilisation de l'utilisation de plusieurs variables, le calcul d'une valeur dans une seul variable est plus rapide de 44%.
Code de test des boucle For :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
}
$time_end = microtime_float();
$duration_for_loop = $time_end - $time_start;)
?>
Code de test des boucle While:
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$i = 0;
$boucle_active = true;
$time_start = microtime_float();
while ($boucle_active)
{
if($i>=$nombre_boucle){$boucle_active=false;}
$i++;
}
$time_end = microtime_float();
$duration_while_loop = $time_end - $time_start;
?>
Résultat pour 500000 boucles sur 5 essais:
La boucle For :
0,0396s
0,0396s
0,0404s
0,0407s
0,0386s
Moyenne = 0,0398s
La boucle While :
0,0443s
0,0435s
0,0441s
0,0446s
0,0439s
Moyenne = 0,0441s
Conclusion :
La boucle For est 10% plus performante que la boucle While dans cette exemple.
Assignation des variables : 'x' et "x" :
Code de test des variable 'x' :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = 'blablabla';
}
$time_end = microtime_float();
$duration_variable_01 = $time_end - $time_start - $duration_for_loop;
?>
Code de test des variable "x" :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = "blablabla";
}
$time_end = microtime_float();
$duration_variable_02 = $time_end - $time_start - $duration_for_loop;
?>
Résultat pour 500000 boucles sur 5 essais:
Assignation des variables 'x' :
0,0436s
0,0462s
0,0424s
0,0418s
0,0459s
Moyenne = 0,0440s
Assignation des variables "x" :
0,0452s
0,0435s
0,0415s
0,0419s
0,0466s
Moyenne = 0,0438s
Conclusion :
L'assignation des variables "x" à une performance équivalente à l'assignation des variables 'x'.
Lecture d'un fichier texte : file_get_contents et fopen-fget :
Ce test va être réalisé en 2 parties : lecture d'un fichier texte d'une ligne et lecture d'un fichier texte de 10 lignes.
Code de test de lecture d'un fichier texte d'une ligne avec file_get_contents :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$time_start = microtime_float();
$nom_fichier = "montexte.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = file_get_contents($nom_fichier);
}
$time_end = microtime_float();
$duration_file_get_contents = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte d'une ligne avec fopen-fget :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$ma_variable = "";
$time_start = microtime_float();
$nom_fichier = "montexte.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$fp = fopen($nom_fichier,"r");
while(!feof($fp))
{
$ma_variable .= fgets($fp,4096) . "n";
}
fclose($fp);
}
$time_end = microtime_float();
$duration_fopen = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte de 10 lignes avec file_get_contents :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$time_start = microtime_float();
$nom_fichier = "montexte10.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$ma_variable = file_get_contents($nom_fichier);
}
$time_end = microtime_float();
$duration_file_get_contents_all = $time_end - $time_start - $duration_for_loop;
?>
Code de test de lecture d'un fichier texte de 10 lignes avec fopen-fget :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 10000;
$ma_variable = "";
$time_start = microtime_float();
$nom_fichier = "montexte10.txt";
for($i=0;$i<$nombre_boucle;$i++)
{
$fp = fopen($nom_fichier,"r");
while(!feof($fp))
{
$ma_variable .= fgets($fp,4096) . "n";
}
fclose($fp);
}
$time_end = microtime_float();
$duration_fopen_all = $time_end - $time_start - $duration_for_loop;
?>
Résultat pour 10000 boucles sur 5 essais :
Lecture d'un fichier texte d'une ligne avec file_get_contents :
0,5492s
0,5503s
0,5395s
0,5420s
0,5610s
Moyenne = 0,5484s
Lecture d'un fichier texte d'une ligne avec fopen-fget :
0,5131s
0,5070s
0,5063s
0,5039s
0,5162s
Moyenne = 0,5093s
Lecture d'un fichier texte de 10 lignes avec file_get_contents :
0,5525s
0,5466s
0,5499s
0,5463s
0,5559s
Moyenne = 0,5502s
Lecture d'un fichier texte de 10 lignes avec fopen-fget:
0,6697s
0,6527s
0,6522s
0,6523s
0,6530s
Moyenne = 0,6560s
Conclusion :
Lors de la lecture d'un fichier texte d'une ligne, la combinaison fopen-fget est plus performante de 7% que la fonction file_get_contents alors que la lecture d'un fichier texte de 10 lignes à l'effet inverse, la fonction file_get_contents est plus performante de 16% que la fonction combinaison fopen-fget.
Infuance des variables sur le code:
Ce test consiste à voir la différence entre la définition de plusieurs variable contre un seul pour obtenir le meme résultat.
Code de test à plusieurs variables :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$val01 = 5;
$val02 = 3;
$val03 = 6;
$val04 = 2;
$val05 = 9;
$val06 = $val01*$val02;
$val07 = $val06/$val03;
$val08 = $val07^$val05;
$val09 = $val08/$val04;
$val10 = $val09^$val07;
}
$time_end = microtime_float();
$duration_val01 = $time_end - $time_start;
?>
Code de test à une variable :
<?php
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$nombre_boucle = 500001;
$time_start = microtime_float();
for($i=0;$i<$nombre_boucle;$i++)
{
$val10 = (((5*3/6)^9)/2)^(5*3/6);
}
$time_end = microtime_float();
$duration_val01 = $time_end - $time_start;
?>
Résultat pour 50000 boucles sur 5 essais :
Test à plusieurs variables :
0,2962s
0,2921s
0,2943s
0,2985s
0,2941s
Moyenne = 0,2950s
Test à une variable :
0,1650s
0,1621s
0,1653s
0,1659s
0,1660s
Moyenne = 0,1648s
Conclusion :
Le test montre une énorme perte de performance lors de l'utilisation de l'utilisation de plusieurs variables, le calcul d'une valeur dans une seul variable est plus rapide de 44%.