⊗ppSpOtAU 82 of 83 menu

Оптимизација на непотребни низи во PHP

Нека пред некој програмер стои задача да ја најде сумата на цели броеви од 1 до 100000000.

Нашиот програмер напиша елегантно решение на оваа задача, вака:

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

Убаво решение, нели? Во еден ред и сè така. Но, тоа не работи! Обидете се да ја стартувате оваа код и ќе ви испадне на екран грешка дека побарале премногу оперативна меморија.

Хм, 100000000 не е толку многу? Или е? Ајде да пресметаме. Функцијата range креира низа со 100000000 броеви. Нека PHP доделува 2 бајти за секој број - тогаш за складирање на нашата низа ќе бидат потребни 200000000 бајти, односно нешто околу 200 мегабајти оперативна меморија.

Но, всушност ќе биде потребна многу повеќе оперативна меморија поради тоа што во PHP има многу големи режиски трошоци при складирање на низа. На пример, кај мене во текстот на грешката пишува дека се обидувам да доделам 4294967304 бајти - нешто околу 4 гигабајти!

Сега е јасно зошто се појавува грешката - далеку надминавме дозволената граница на меморија.

Не е толку тешко да го преработиме нашиот скрипт во друг, кој речиси и не троши оперативна меморија:

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

А уште подобро да користиме математичко решение:

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

Пред некој програмер стоеше задача да го најде факториелот на даден број. Тој ја реши така на следниов начин:

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

Објаснете, што не е во ред со овој код. Преработете го кодот во пооптимален.

Пред некој програмер стоеше задача да го најде бројот на цифри со кои може да се запишат сите цели броеви од 1 до 1000000. Тој ја реши на следниов начин:

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

Објаснете, што не е во ред со овој код. Преработете го кодот во пооптимален.

Пред некој програмер стоеше задача да го најде бројот на броеви кои се делат без остаток со 7, кои се наоѓаат во даден интервал. Тој ја реши на следниов начин:

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

Објаснете, што не е во ред со овој код. Преработете го кодот во пооптимален.

Пред некој програмер стоеше задача да ја најде сумата на делителите на број. Тој ја реши на следниов начин:

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

Објаснете, што не е во ред со овој код. Преработете го кодот во пооптимален.

Македонски
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние користиме колачиња за работата на веб-страната, анализа и персонализација. Обработката на податоци се врши во согласност со Политиката за приватност.
прифати ги сите прилагоди одбиј