Optimering av onödiga arrayer i PHP
Låt oss säga att en programmerare har i uppgift att
hitta summan av heltal från 1 till 100000000.
Vår programmerare skrev en elegant lösning på detta problem, så här:
<?php
echo array_sum(range(1, 100000000));
?>
En vacker lösning, eller hur? På en rad och allt. Men den fungerar inte! Försök köra den här koden så kommer den att visa ett felmeddelande om att du har begärt för mycket minne.
Hmm, 100000000 verkar inte så mycket?
Eller är det mycket? Låt oss räkna. Funktionen range
skapar en array med 100000000 tal.
Låt oss anta att PHP allokerar 2 byte
per tal - då krävs det
200000000 byte för att lagra vår array,
alltså ungefär
200 megabyte minne.
Men i verkligheten kommer det att krävas
betydligt mer minne på grund av att PHP har
mycket stora omkostnader vid lagring av arrayer.
Till exempel, i mitt felmeddelande står det
att jag försöker allokera 4294967304
byte - ungefär 4 gigabyte!
Nu är det förståeligt varför felet uppstår - vi har långt överskridit den tillåtna minnesgränsen.
Det är inte så svårt att skriva om vårt skript till ett annat, som nästan inte förbrukar något minne:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Eller ännu bättre använder vi en matematisk lösning:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
En programmerare hade i uppgift att hitta fakulteten av ett givet tal. Hen löste det på följande sätt:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal.
En programmerare hade i uppgift att hitta
antalet siffror som krävs för att
skriva alla heltal från 1 till 1000000.
Hen löste det på följande sätt:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal.
En programmerare hade i uppgift att hitta
antalet tal som är jämnt delbara med
7, inom ett givet
intervall. Hen löste det på följande sätt:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal.
En programmerare hade i uppgift att hitta summan av en tals delare. Hen löste det på följande sätt:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal.