Optimizimi i vargjeve të panevojshme në PHP
Le të themi se një programues ka përpara detyrën
të gjejë shumën e numrave të plotë nga 1 në 100000000.
Programuesi ynë shkroi një zgjidhje elegante për këtë detyrë, si më poshtë:
<?php
echo array_sum(range(1, 100000000));
?>
Zgjidhje e bukur, apo jo? Në një rresht dhe gjithçka. Por nuk funksionon! Provoni të ekzekutoni këtë kod dhe ai do të shfaqë në ekran një gabim se keni kërkuar shumë kujtesë operative.
Hmm, 100000000 duket jo aq shumë?
Apo është shumë? Le të llogarisim. Funksioni range
krijon një varg me 100000000 numra.
Le të supozojmë se PHP ndan 2 bajt
për një numër - atëherë për të ruajtur vargun tonë do të nevojiten
200000000 bajt, domethënë rreth
200 megabajt kujtesë operative.
Por në fakt do të nevojitet shumë më e madhe
kujtesë operative për shkak të faktit se PHP ka
shpenzime shumë të mëdha overhead kur ruan një varg.
Për shembull, në tekstin e gabimit tim, më tregon
se po përpiqem të ndaj 4294967304
bajt - rreth 4 gigabajt!
Është e qartë tani pse del gabimi - ne kemi tejkaluar larg limitin e lejuar të kujtesës.
Nuk është aq e vështirë ta rishkruajmë skriptin tonë në një tjetër, që praktikisht nuk konsumon kujtesë operative:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Ose më mirë përdorim zgjidhjen matematikore:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Një programues kishte përpara detyrën të gjejë faktorielin e një numri të caktuar. Ai e zgjidhi atë si më poshtë:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.
Një programues kishte përpara detyrën të gjejë
numrin e shifrave me të cilat mund të
shkruhen të gjithë numrat e plotë nga 1 në 1000000.
Ai e zgjidhi atë si më poshtë:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.
Një programues kishte përpara detyrën të gjejë
numrin e numrave që pjesëtohen pa mbetje me
7, që ndodhen në një
interval të caktuar. Ai e zgjidhi atë si më poshtë:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.
Një programues kishte përpara detyrën të gjejë shumën e pjesëtuesve të një numri. Ai e zgjidhi atë si më poshtë:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.