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%.