Optimalisering av unødvendige arrays i PHP
La oss si at en programmerer har oppgaven med å
finne summen av heltall fra 1 til 100000000.
Vår programmerer skrev en elegant løsning på denne oppgaven, slik:
<?php
echo array_sum(range(1, 100000000));
?>
En vakker løsning, er den ikke? På én linje og alt det der. Men den fungerer ikke! Prøv å kjøre denne koden og den vil vise en feil om at du har bedt om for mye minne.
Hmm, 100000000 virker ikke som så mye?
Eller er det mye? La oss regne. Funksjonen range
oppretter en array med 100000000 tall.
La oss si at PHP tildeler 2 bytes
per tall - da vil lagring av vår array kreve
200000000 bytes, det vil si omtrent
200 megabyte minne.
Men faktisk vil det kreves mye mer minne
fordi PHP har veldig store overheadkostnader ved lagring av arrays.
For eksempel, i min tekst står det i feilmeldingen
at jeg prøver å tildele 4294967304
bytes - noe som utgjør omtrent 4 gigabyte!
Det er nå klart hvorfor feilen oppstår - vi har langt overskredet den tillatte minnegrensen.
Det er ikke så vanskelig å omskrive skriptet vårt til et annet, som nesten ikke bruker minne:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Eller enda bedre, la oss bruke en matematisk løsning:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
En programmerer hadde oppgaven med å finne fakultetet til et gitt tall. Han løste den på følgende måte:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.
En programmerer hadde oppgaven med å finne
antall sifre som trengs for å
skrive alle heltall fra 1 til 1000000.
Han løste den på følgende måte:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.
En programmerer hadde oppgaven med å finne
antall tall som er delelige uten rest på
7, innenfor et gitt
intervall. Han løste den på følgende måte:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.
En programmerer hadde oppgaven med å finne summen av divisorer til et tall. Han løste den på følgende måte:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.