PHP-silmukoiden turhien kierrosten optimointi
Seuraavassa koodissa ohjelmoija tarkistaa,
onko taulukossa numero 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);
?>
Mikä hänen ratkaisussaan on vialla? Vaikuttaa siltä, ettei
silmukassa tehdä mitään ylimääräisiä operaatioita. Ongelma
kuitenkin on, että sen jälkeen kun on todettu,
että numero 3 on taulukossa - silmukka
pyörii silti loppuun asti.
Kaikkein epäjärkevintä on, jos numero 3
löytyy jostain taulukon alusta, ja itse taulukko
on pitkä, esimerkiksi 1000 elementtiä.
Siitä tulee tuhat hyödytöntä ylimääräistä silmukan
iteraatiota! Ei optimaalista.
Optimoimme koodin pysäyttämällä silmukan ajoissa:
<?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);
?>
Seuraava koodi laskee, kuinka monta
taulukon elementtiä täytyy laskea yhteen,
jotta summasta tulee suurempi kuin 10.
Suorita optimointi:
<?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;
?>
Seuraava koodi tulostaa parilliset numerot annetulta väliltä. Suorita optimointi:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0) {
echo $i;
}
}
?>
Seuraava koodi tulostaa numerot,
joille pätee sekä 2:lla
että 3:lla jaollisuus. Suorita optimointi:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0 and $i % 3 === 0) {
echo $i;
}
}
?>