Optimering af unødvendige loop-gennemløb i PHP
I følgende kode tjekker en programmør,
om arrayet indeholder tallet 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);
?>
Hvad er der galt med hans løsning? Umiddelbart ser det ud til,
at der ikke udføres nogen unødvendige operationer i loopet. Problemet
er imidlertid, at efter det er blevet fastslået,
at tallet 3 er i arrayet, fortsætter loopet
stadig med at køre til slutningen af arrayet.
Det mest urationelle vil være, hvis tallet 3
bliver fundet et sted i starten af arrayet, mens selve arrayet
har en længde på, for eksempel, 1000 elementer.
Det vil resultere i tusind ubrugelige, unødvendige loop-iterationer!
Ikke optimalt.
Lad os optimere koden ved at stoppe loopet til tiden:
<?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);
?>
Følgende kode beregner, hvor mange
elementer af arrayet der skal lægges sammen,
før summen bliver større end 10.
Udfør optimering:
<?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;
?>
Følgende kode udskriver lige tal fra et givet interval. Udfør optimering:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0) {
echo $i;
}
}
?>
Følgende kode udskriver tal,
der er delelige med både 2
og 3. Udfør optimering:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0 and $i % 3 === 0) {
echo $i;
}
}
?>