Tsükli liigsete iteratsioonide optimeerimine PHP-s
Järgmises koodis kontrollib üks programmeerija,
kas massiivis on number 3:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$exists = false;
foreach ($arr as $elem) {
if ($elem == 3) {
$exists = true;
}
}
var_dump($exists);
?>
Mis on selle lahendusega valesti? Näib, et
tsüklis ei tehta üleliigseid operatsioone. Probleem
on aga selles, et pärast seda, kui on kindlaks tehtud,
et number 3 on massiivis - tsükkel
ikkagi jätkab kuni massiivi lõpuni.
Kõige ebaratsionaalsem on see, kui number 3
leitakse kuskil massiivi alguses, aga massiiv ise
on pikk, näiteks 1000 elementi.
Sel juhul tehakse tuhat kasutut iteratsiooni
tsüklis! Mitte optimaalne.
Optimeerime koodi, peatades tsükli õigel ajal:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$exists = false;
foreach ($arr as $elem) {
if ($elem == 3) {
$exists = true;
break;
}
}
var_dump($exists);
?>
Järgmine kood loeb kokku, mitu
massiivi elementi tuleb liita,
et summa muutuks suuremaks kui 10.
Tehke optimeerimine:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$sum = 0;
$i = 1;
foreach ($arr as $elem) {
$sum += $elem;
if ($sum <= 10) {
$i++;
}
}
echo $i;
?>
Järgmine kood väljastab paarisarvud antud vahemikust. Tehke optimeerimine:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0) {
echo $i;
}
}
?>
Järgmine kood väljastab arvud,
mis jaguvad samaaegselt nii 2-ga
kui ka 3-ga. Tehke optimeerimine:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0 and $i % 3 === 0) {
echo $i;
}
}
?>