⊗ppSpOtAU 82 of 83 menu

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.

Français
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Nous utilisons des cookies pour le fonctionnement du site, l'analyse et la personnalisation. Le traitement des données est effectué conformément à la Politique de confidentialité.
accepter tout personnaliser refuser