Felesleges tömbök optimalizálása PHP-ban
Tegyük fel, hogy egy programozó előtt az a feladat áll,
hogy keresse meg az egész számok összegét 1-től 100000000-ig.
Programozónk elegáns megoldást írt erre a feladatra, így:
<?php
echo array_sum(range(1, 100000000));
?>
Szép megoldás, nem igaz? Egy sorban és minden. De nem működik! Próbáld meg futtatni ezt a kódot, és hibát fog kiírni arról, hogy túl sok memóriát igényeltél.
Hmm, 100000000 nem tűnik olyan soknak?
Vagy mégis? Számoljunk. A range függvény
létrehoz egy tömböt 100000000 számmal.
Tegyük fel, hogy a PHP 2 bájtot foglal le egy számra
- ekkor a tömbünk tárolásához
200000000 bájtra, azaz kb.
200 megabájt memóriára lesz szükség.
Valójában jóval több memóriára lesz szükség
amiatt, mert a PHP-ban nagyon
nagyok a tömbök tárolásának rezsiköltsége.
Például nálam a hibaüzenet szerint
4294967304 bájtot próbáltam lefoglalni
- ez kb. 4 gigabájt!
Most már világos, miért jön a hiba - jóval túlléptük a megengedett memórialimitust.
Nem olyan nehéz átírni a szkriptünket egy másikra, amely gyakorlatilag nem fogyaszt memóriát:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Vagy még jobb, ha matematikai megoldást használunk:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Egy programozó előtt az a feladat állt, hogy keresse egy adott szám faktoriálisát. Ő a következőképpen oldotta meg:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.
Egy programozó előtt az a feladat állt, hogy keresse
meg azon számjegyek számát, amelyekkel
le lehet írni az összes egész számot 1-től 1000000-ig.
Ő a következőképpen oldotta meg:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.
Egy programozó előtt az a feladat állt, hogy keresse
a maradék nélkül 7-tel osztható
számok számát egy adott intervallumban. Ő a következőképpen oldotta meg:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.
Egy programozó előtt az a feladat állt, hogy keresse egy szám osztóinak összegét. Ő a következőképpen oldotta meg:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.