⊗ppSpOtAU 82 of 83 menu

Optimalisering av unødvendige arrays i PHP

La oss si at en programmerer har oppgaven med å finne summen av heltall fra 1 til 100000000.

Vår programmerer skrev en elegant løsning på denne oppgaven, slik:

<?php echo array_sum(range(1, 100000000)); ?>

En vakker løsning, er den ikke? På én linje og alt det der. Men den fungerer ikke! Prøv å kjøre denne koden og den vil vise en feil om at du har bedt om for mye minne.

Hmm, 100000000 virker ikke som så mye? Eller er det mye? La oss regne. Funksjonen range oppretter en array med 100000000 tall. La oss si at PHP tildeler 2 bytes per tall - da vil lagring av vår array kreve 200000000 bytes, det vil si omtrent 200 megabyte minne.

Men faktisk vil det kreves mye mer minne fordi PHP har veldig store overheadkostnader ved lagring av arrays. For eksempel, i min tekst står det i feilmeldingen at jeg prøver å tildele 4294967304 bytes - noe som utgjør omtrent 4 gigabyte!

Det er nå klart hvorfor feilen oppstår - vi har langt overskredet den tillatte minnegrensen.

Det er ikke så vanskelig å omskrive skriptet vårt til et annet, som nesten ikke bruker minne:

<?php $sum = 0; for ($i = 1; $i <= 100000000; $i++) { $sum += $i; } echo $sum; ?>

Eller enda bedre, la oss bruke en matematisk løsning:

<?php $n = 1000000; $sum = $n * ($n + 1) / 2; echo $sum; ?>

En programmerer hadde oppgaven med å finne fakultetet til et gitt tall. Han løste den på følgende måte:

<?php $n = 100; echo array_product(range(1, $n)); ?>

Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.

En programmerer hadde oppgaven med å finne antall sifre som trengs for å skrive alle heltall fra 1 til 1000000. Han løste den på følgende måte:

<?php echo strlen(implode('', range(1, 1000000))); ?>

Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.

En programmerer hadde oppgaven med å finne antall tall som er delelige uten rest på 7, innenfor et gitt intervall. Han løste den på følgende måte:

<?php $arr = []; for ($i = 0; $i <= 1000; $i++) { if ($i % 7 == 0) { $arr[] = $i; } } echo count($arr); ?>

Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.

En programmerer hadde oppgaven med å finne summen av divisorer til et tall. Han løste den på følgende måte:

<?php $num = 320; $divs = []; for ($i = 0; $i <= $num; $i++) { if ($num % $i == 0) { $divs[] = $i; } } echo array_sum($divs); ?>

Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.

Norsk
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Vi bruker informasjonskapsler for nettstedets funksjonalitet, analyse og personalisering. Behandling av data foregår i henhold til Personvernerklæringen.
godta alle tilpass avvis