Optimización de arrays innecesarios en PHP
Supongamos que un programador tiene la tarea
de encontrar la suma de números enteros desde 1 hasta 100000000.
Nuestro programador escribió una solución elegante para este problema, así:
<?php
echo array_sum(range(1, 100000000));
?>
Una solución bonita, ¿no? En una línea y todo eso. Pero no funciona. ¡Intenta ejecutar este código y mostrará un error acerca de que solicitaste demasiada memoria RAM.
Bueno, ¿100000000 no parece tanto?
¿O sí? Vamos a contar. La función range
crea un array con 100000000 números.
Supongamos que PHP asigna 2 bytes
por número - entonces para almacenar nuestro array necesitaríamos
200000000 bytes, es decir, algo alrededor de
200 megabytes de memoria RAM.
Pero en realidad se necesitará mucha más
memoria RAM debido a que PHP tiene
gastos generales muy grandes al almacenar un array.
Por ejemplo, en mi caso el error indica
que estoy intentando asignar 4294967304
bytes - ¡algo como 4 gigabytes!
Queda claro ahora por qué sale el error - hemos excedido con creces el límite de memoria permitido.
No es tan difícil reescribir nuestro script de otra manera, prácticamente sin consumir memoria RAM:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
O mejor aún, usamos la solución matemática:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Un programador tenía la tarea de encontrar el factorial de un número dado. Lo resolvió de la siguiente manera:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Explica qué está mal con este código. Reescribe el código de manera más óptima.
Un programador tenía la tarea de encontrar
la cantidad de dígitos necesarios para
escribir todos los números enteros desde 1 hasta 1000000.
Lo resolvió de la siguiente manera:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Explica qué está mal con este código. Reescribe el código de manera más óptima.
Un programador tenía la tarea de encontrar
la cantidad de números divisibles exactamente por
7, dentro de un intervalo dado. Lo resolvió de la siguiente manera:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Explica qué está mal con este código. Reescribe el código de manera más óptima.
Un programador tenía la tarea de encontrar la suma de los divisores de un número. Lo resolvió de la siguiente manera:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Explica qué está mal con este código. Reescribe el código de manera más óptima.