ご想像のとおり、例2の方が高速であり、コンパイラーはそれを行いません。
概要

パフォーマンステスト
例1、ループ内の条件:
Time taken: 0.2501 seconds
Time taken: 0.2336 seconds
Time taken: 0.2335 seconds
Time taken: 0.2319 seconds
Time taken: 0.2337 seconds
Average: 0.2364 seconds
そしてコード:
<?php
$list = array();
for ($i = 0; $i < 1000000; $i++) {
$list[] = md5(rand(0, 100000) * $i);
}
$a = microtime(true);
$test = 2;
foreach ($list as $listItem) {
if ($test == 1) {
$listItem .= " - one";
} else if ($test == 2) {
$listItem .= " - two";
} else if ($test == 3) {
$listItem .= " - three";
}
}
echo "Time taken: " . number_format(microtime(true) - $a, 4) . " seconds";
?>
例2、ループ外の条件:
Time taken: 0.1424 seconds
Time taken: 0.1426 seconds
Time taken: 0.1364 seconds
Time taken: 0.1348 seconds
Time taken: 0.1347 seconds
Average: 0.1382 seconds
そしてコード:
<?php
$list = array();
for ($i = 0; $i < 1000000; $i++) {
$list[] = md5(rand(0, 100000) * $i);
}
$a = microtime(true);
$test = 2;
if ($test == 1) {
foreach ($list as $listItem) {
$listItem .= " - one";
}
} else if ($test == 2) {
foreach ($list as $listItem) {
$listItem .= " - two";
}
} else if ($test == 3) {
foreach ($list as $listItem) {
$listItem .= " - three";
}
}
echo "Time taken: " . number_format(microtime(true) - $a, 4) . " seconds";
?>
さて、それはループ外の条件のかなり明白な勝利ですが、intではなくブール値と比較しようとするとどうなりますか?
例3、ループ内の条件付け。ただし、代わりにブール値を使用して条件付けします。
Time taken: 0.1845 seconds
Time taken: 0.1821 seconds
Time taken: 0.1745 seconds
Time taken: 0.1777 seconds
Time taken: 0.1767 seconds
Average: 0.1791 seconds
そしてコード:
<?php
$list = array();
for ($i = 0; $i < 1000000; $i++) {
$list[] = md5(rand(0, 100000) * $i);
}
$a = microtime(true);
$test = 2;
$result1 = ($test == 1);
$result2 = ($test == 2);
$result3 = ($test == 3);
foreach ($list as $listItem) {
if ($result1) {
$listItem .= " - one";
} else if ($result2) {
$listItem .= " - two";
} else if ($result3) {
$listItem .= " - three";
}
}
echo "Time taken: " . number_format(microtime(true) - $a, 4) . " seconds";
?>
面白い。次のような組み込み関数を使用するとどうなりarray_walk
ますか?
例4 array_walk
、:
Time taken: 0.4950 seconds
Time taken: 0.4946 seconds
Time taken: 0.4947 seconds
Time taken: 0.4937 seconds
Time taken: 0.4918 seconds
Average: 0.4940 seconds
そしてコード:
<?php
function append_string($value, $suffix) {
return $value . $suffix;
}
$list = array();
for ($i = 0; $i < 1000000; $i++) {
$list[] = md5(rand(0, 100000) * $i);
}
$a = microtime(true);
$test = 2;
if ($test == 1) {
array_walk($list, "append_string", " - one");
} else if ($test == 2) {
array_walk($list, "append_string", " - two");
} else if ($test == 3) {
array_walk($list, "append_string", " - three");
}
echo "Time taken: " . number_format(microtime(true) - $a, 4) . " seconds";
?>
何?! 組み込み関数がCまたはC++関数よりも抽象化すると思うかもしれませんが、それは非常にうまくいくかもしれませんが、問題は、関数呼び出しによってこのメソッドが非常に遅くなることです。
長所短所
例1の長所
- ループを複数回宣言する必要はありません(複数の条件がある場合は煩わしいかもしれません)
例1の短所
- これは、最初の3つのテストすべての中で最も遅いテストです(例2より71%遅く、例3より32%遅い)
例2の長所
例2短所
- ループを数回宣言する必要があります(条件の数と同じ回数)
例3の長所
- 例1のように、ループを複数回宣言する必要はありません。
- #example1よりも高速です
例3短所
- #example 2よりもまだ遅い(約30%)
- もっと散らかっているように見える
例4の長所
例4短所
- これは、ロットの中で最も遅いものです(2番目に遅いもの(例#1)よりも約100%遅い)。おそらく、関数を1,000,000回呼び出さなければならないためです。
- グローバルスコープから外れているため、グローバルスコープ
global
のすべての変数を使用する必要があります。
結論
PHPコンパイラはそれを行いません。パフォーマンスが必要な場合は、たとえば#2に進む必要がありますが、このテストは、100万のエントリを持つ配列を使用して行われます。配列にはそれほど多くのエントリが含まれない可能性があるため、代わりに例1または例3を使用することをお勧めします。ああ、そして例えば#4には行かないでください。