⊗ppSpOtAU 82 of 83 menu

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.

Español
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Usamos cookies para el funcionamiento del sitio, análisis y personalización. El procesamiento de datos se realiza de acuerdo con la Política de privacidad.
aceptar todas configurar rechazar