⊗ppSpOtAU 82 of 83 menu

Ottimizzazione di array non necessari in PHP

Supponiamo che un programmatore abbia il compito di trovare la somma dei numeri interi da 1 a 100000000.

Il nostro programmatore ha scritto una soluzione elegante per questo problema, in questo modo:

<?php echo array_sum(range(1, 100000000)); ?>

Una bella soluzione, non è vero? In una riga sola e tutto il resto. Ma non funziona! Provate ad eseguire questo codice e visualizzerà un errore che indica che è stata richiesta troppa memoria.

Mmh, 100000000 non sembra così tanto? O forse sì? Calcoliamo. La funzione range crea un array con 100000000 numeri. Supponiamo che PHP allochi 2 byte per numero - allora per memorizzare il nostro array serviranno 200000000 byte, cioè circa 200 megabyte di memoria RAM.

Ma in realtà servirà molta più memoria a causa degli alti costi generali in PHP per la memorizzazione degli array. Ad esempio, nel mio caso l'errore indica che sto tentando di allocare 4294967304 byte - circa 4 gigabyte!

Ora è chiaro perché si verifica l'errore - abbiamo superato di gran lunga il limite di memoria consentito.

Non è così difficile riscrivere il nostro script in un modo diverso, che consuma praticamente nessuna memoria:

<?php $sum = 0; for ($i = 1; $i <= 100000000; $i++) { $sum += $i; } echo $sum; ?>

O ancora meglio, usiamo la soluzione matematica:

<?php $n = 1000000; $sum = $n * ($n + 1) / 2; echo $sum; ?>

Un programmatore aveva il compito di trovare il fattoriale di un dato numero. Lo ha risolto nel modo seguente:

<?php $n = 100; echo array_product(range(1, $n)); ?>

Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.

Un programmatore aveva il compito di trovare il numero di cifre necessarie per scrivere tutti i numeri interi da 1 a 1000000. Lo ha risolto nel modo seguente:

<?php echo strlen(implode('', range(1, 1000000))); ?>

Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.

Un programmatore aveva il compito di trovare il numero di numeri divisibili senza resto per 7, all'interno di un intervallo specificato. Lo ha risolto nel modo seguente:

<?php $arr = []; for ($i = 0; $i <= 1000; $i++) { if ($i % 7 == 0) { $arr[] = $i; } } echo count($arr); ?>

Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.

Un programmatore aveva il compito di trovare la somma dei divisori di un numero. Lo ha risolto nel modo seguente:

<?php $num = 320; $divs = []; for ($i = 0; $i <= $num; $i++) { if ($num % $i == 0) { $divs[] = $i; } } echo array_sum($divs); ?>

Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.

Italiano
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesia日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Utilizziamo i cookie per il funzionamento del sito, l'analisi e la personalizzazione. I dati vengono elaborati in conformità con la Politica sulla privacy.
accetta tutto personalizza rifiuta