⊗ppSpOtAU 82 of 83 menu

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.

Afrikaans
AzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ons gebruik koekies vir die werking van die webwerf, ontleding en personalisering. Die verwerking van data geskied volgens die Privaatheidsbeleid.
aanvaar alles instel verwerp