Optimering van onnodige skikkings in PHP
Laat ons sê 'n programmeerder het die taak om
die som van heelgetalle van 1 tot 100000000 te vind.
Ons programmeerder het 'n elegante oplossing vir hierdie probleem geskryf, soos volg:
<?php
echo array_sum(range(1, 100000000));
?>
'n Mooi oplossing, is dit nie? In een lyn en so meer. Maar dit werk nie! Probeer om hierdie kode uit te voer en dit sal 'n fout toon dat jy te veel geheue versoek het.
Hmm, is 100000000 nie soveel nie?
Of is dit? Kom ons bereken. Die funksie range
skep 'n skikking met 100000000 getalle.
Gestel PHP ken 2 grepe toe
vir elke getal - dan sal die stoor van ons skikking
200000000 grepe benodig,
dus ongeveer 200 megagrepe geheue.
Maar eintlik sal baie meer geheue benodig word
vanweë die groot oorgangkoste wat PHP het
vir die stoor van 'n skikking.
Byvoorbeeld, in my teks wys die foutboodskap
dat ek probeer om 4294967304
grepe toe te ken - dit is ongeveer 4 gigagrepe!
Dit is nou duidelik waarom die fout voorkom - ons het die toegelate geheuelimiet ver oorskry.
Dit is nie so moeilik om ons skrip te herskryf na 'n ander een nie, wat feitlik geen geheue gebruik nie:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
En nog beter, laat ons die wiskundige oplossing gebruik:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
'n Programmeerder het die taak gehad om die fakulteit van 'n gegewe getal te vind. Hy het dit soos volg opgelos:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Verduidelik wat verkeerd is met hierdie kode. Herskryf die kode na 'n meer optimale een.
'n Programmeerder het die taak gehad om die
aantal syfers te vind wat nodig is om
alle heelgetalle van 1 tot 1000000 te skryf.
Hy het dit soos volg opgelos:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Verduidelik wat verkeerd is met hierdie kode. Herskryf die kode na 'n meer optimale een.
'n Programmeerder het die taak gehad om die
aantal getalle te vind wat sonder 'n rest deelbaar is deur
7, in 'n gegewe
interval. Hy het dit soos volg opgelos:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Verduidelik wat verkeerd is met hierdie kode. Herskryf die kode na 'n meer optimale een.
'n Programmeerder het die taak gehad om die som van die delers van 'n getal te vind. Hy het dit soos volg opgelos:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Verduidelik wat verkeerd is met hierdie kode. Herskryf die kode na 'n meer optimale een.