Optimalisatie van overbodige arrays in PHP
Stel, een programmeur heeft de taak
om de som van gehele getallen van 1 tot 100000000 te vinden.
Onze programmeur heeft een elegante oplossing voor deze taak geschreven, als volgt:
<?php
echo array_sum(range(1, 100000000));
?>
Een mooie oplossing, nietwaar? In één regel en zo. Maar het werkt niet! Probeer deze code uit te voeren en hij zal een fout tonen over het feit dat je te veel werkgeheugen hebt aangevraagd.
Hmm, 100000000 lijkt niet zo veel?
Of toch? Laten we rekenen. De functie range
maakt een array met 100000000 getallen.
Stel dat PHP 2 bytes per getal toewijst
- dan is er voor het opslaan van onze array
200000000 byte nodig, dat is ongeveer
200 megabyte werkgeheugen.
Maar in werkelijkheid is er veel meer werkgeheugen nodig
vanwege de zeer hoge overheadkosten
bij het opslaan van een array in PHP.
Bijvoorbeeld, in mijn tekst geeft de foutmelding aan
dat ik 4294967304
byte probeer toe te wijzen - dat is ongeveer 4 gigabyte!
Het is nu duidelijk waarom de fout optreedt - we hebben de toegestane geheugenlimiet ver overschreden.
Het is niet zo moeilijk om ons script te herschrijven naar een versie die praktisch geen werkgeheugen verbruikt:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Of nog beter, we gebruiken een wiskundige oplossing:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Een programmeur had de taak om de faculteit van een bepaald getal te vinden. Hij loste het als volgt op:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.
Een programmeur had de taak om het
aantal cijfers te vinden dat nodig is om
alle gehele getallen van 1 tot 1000000 te schrijven.
Hij loste het als volgt op:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.
Een programmeur had de taak om het
aantal getallen te vinden die deelbaar zijn door
7 zonder rest, binnen een bepaald
bereik. Hij loste het als volgt op:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.
Een programmeur had de taak om de som van de delers van een getal te vinden. Hij loste het als volgt op:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.