Optimisation des tableaux inutiles en PHP
Supposons qu'un programmeur ait pour tâche
de trouver la somme des nombres entiers de 1 à 100000000.
Notre programmeur a écrit une solution élégante à ce problème, comme ceci :
<?php
echo array_sum(range(1, 100000000));
?>
Belle solution, n'est-ce pas ? En une seule ligne et tout ça. Mais elle ne fonctionne pas ! Essayez d'exécuter ce code et il affichera une erreur indiquant que vous avez demandé trop de mémoire vive.
Hum, 100000000 ne semble pas énorme ?
Ou si ? Comptons. La fonction range
crée un tableau avec 100000000 nombres.
Supposons que PHP alloue 2 octets
pour un nombre - alors pour stocker notre tableau, il faudrait
200000000 octets, soit environ
200 mégaoctets de mémoire vive.
Mais en réalité, il faudra beaucoup plus de mémoire vive
en raison des très
grands frais généraux dans PHP pour le stockage des tableaux.
Par exemple, dans mon texte d'erreur, il est indiqué
que j'essaie d'allouer 4294967304
octets - soit environ 4 gigaoctets !
On comprend maintenant pourquoi l'erreur se produit - nous avons largement dépassé la limite de mémoire autorisée.
Il n'est pas si difficile de réécrire notre script d'une autre manière, qui consomme pratiquement pas de mémoire vive :
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Ou encore mieux, utilisons une solution mathématique :
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Un programmeur avait pour tâche de trouver la factorielle d'un nombre donné. Il l'a résolu de la manière suivante :
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Expliquez ce qui ne va pas avec ce code. Retravaillez le code pour le rendre plus optimal.
Un programmeur avait pour tâche de trouver
le nombre de chiffres nécessaires pour
écrire tous les nombres entiers de 1 à 1000000.
Il l'a résolu de la manière suivante :
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Expliquez ce qui ne va pas avec ce code. Retravaillez le code pour le rendre plus optimal.
Un programmeur avait pour tâche de trouver
le nombre de nombres divisibles sans reste par
7, se trouvant dans un intervalle donné.
Il l'a résolu de la manière suivante :
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Expliquez ce qui ne va pas avec ce code. Retravaillez le code pour le rendre plus optimal.
Un programmeur avait pour tâche de trouver la somme des diviseurs d'un nombre. Il l'a résolu de la manière suivante :
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Expliquez ce qui ne va pas avec ce code. Retravaillez le code pour le rendre plus optimal.