PHP 中 for 迴圈和 foreach 迴圈的效能和可讀性
-
for
迴圈和foreach
迴圈與範圍 -
帶有字尾和字首增量的
for
迴圈 -
帶有
count
函式的for
迴圈 -
沒有鍵的
foreach
和有鍵的foreach
-
帶有
count
函式的for
迴圈和帶有鍵和值的foreach
-
帶有
count
和foreach
的for
迴圈沒有鍵 -
帶有
count
的for
迴圈和帶有範圍的foreach
-
for
迴圈和foreach
迴圈的可讀性
本文對 PHP 中的 for
迴圈和 foreach
進行了比較。該比較旨在確定哪個迴圈具有更快的執行速度和更好的可讀性。
for
迴圈和 foreach
迴圈與範圍
我們在十萬次迭代中比較了 for
迴圈和 foreach
迴圈與 range
。測試結果表明 for
迴圈比 foreach
迴圈執行得更快。
原因是 for
迴圈通過增加整數值來進行比較。相比之下,foreach
和 range
必須在提取每個元素並檢查陣列末尾之前建立一個陣列。
<?php
$time_one = microtime(true);
for ($i=0; $i < 100000; $i++) {
# code...
}
echo 'For loop: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach (range(0, 100000) as $i) {
# code...
}
echo 'Foreach + range loop: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop: 0.001291036605835 s
Foreach + range loop: 0.00661301612854 s
帶有字尾和字首增量的 for
迴圈
如果時間差非常關鍵,你應該知道帶有字首增量的 for
迴圈比帶有字尾增量的 for
迴圈執行得更快。
這是因為字尾在將前一個值加一之前保留了前一個值的副本,而字首增量在不保留前一個值的副本的情況下加一。
例子:
<?php
$time_one = microtime(true);
for ($i=0; $i < 100000; ++$i) {
# code...
}
echo 'For loop with prefix $i: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
for ($i=0; $i < 100000; $i++) {
# code...
}
echo 'For loop with postfix $i: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop with prefix $i: 0.0012187957763672 s
For loop with postfix $i: 0.0031270980834961 s
帶有 count
函式的 for
迴圈
帶有 count
函式的 for
迴圈比沒有的執行得更快。
我們在下面的程式碼塊中執行了兩個測試,第一個測試使用了一個帶有 count
函式的 for
迴圈,第二個測試使用了沒有 count
函式的陣列中元素的數量。
例子:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count function: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
for ($i=0; $i < 10; $i++) {
# code...
}
echo 'For loop without count function: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop with count function: 6.9141387939453E-6 s
For loop without count function: 9.5367431640625E-7 s
沒有鍵的 foreach
和有鍵的 foreach
與帶有鍵和值的 foreach
迴圈相比,沒有鍵的 foreach
迴圈執行得更快。
下面的程式碼片段有一個由十個元素組成的陣列,我們在陣列上執行一個 foreach
迴圈。第一次執行不使用鍵,而第二次執行使用鍵和值。
例子:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
foreach ($myArray as $value) {
# code...
}
echo 'Foreach loop without key: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$t01 = microtime(true);
foreach ($myArray as $key => $value) {
# code...
}
echo 'Foreach loop with key and value: ' . (microtime(true) - $t01) . ' s', PHP_EOL;
?>
輸出:
Foreach loop without key: 0.00055599212646484 s
Foreach loop with key and value: 9.5367431640625E-7 s
帶有 count
函式的 for
迴圈和帶有鍵和值的 foreach
在 foreach
(帶有鍵和值)和 for
之間使用 count
函式對包含十個元素的陣列進行測試表明,帶有鍵和值的 foreach
比帶有計數功能。
例子:
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach ($myArray as $key => $value) {
# code...
}
echo 'Foreach loop with key and value: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop with count: 8.1062316894531E-6 s
Foreach loop with key and value: 2.1457672119141E-6 s
帶有 count
和 foreach
的 for
迴圈沒有鍵
帶有 count
功能的 for
迴圈和不帶鍵的 foreach
迴圈都以相同的速度執行。
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach ($myArray as $value) {
# code...
}
echo 'Foreach loop without key: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop with count: 9.5367431640625E-7 s
Foreach loop without key: 9.5367431640625E-7 s
帶有 count
的 for
迴圈和帶有範圍的 foreach
帶有 count 的 for
迴圈比帶有 range 的 foreach
迴圈執行得更快。
<?php
$myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24];
$time_one = microtime(true);
for ($i=0; $i < count($myArray); $i++) {
# code...
}
echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL;
echo "<br />";
$time_two = microtime(true);
foreach (range(0, 10) as $i) {
# code...
}
echo 'Foreach loop with range: ' . (microtime(true) - $time_two) . ' s', PHP_EOL;
?>
輸出:
For loop with count: 1.0013580322266E-5 s
Foreach loop with range: 3.0994415283203E-6 s
請注意,當你在 Web 瀏覽器中執行程式碼示例時,你會得到不同的時間結果。我們在 Windows 10 上使用 PHP 8.1.2 執行了上述所有程式碼示例。
for
迴圈和 foreach
迴圈的可讀性
在可讀性方面,你會發現 for
迴圈比 foreach
迴圈具有更好的可讀性。這是因為,對於 for
迴圈,你會知道你正在比較一個小於較大數字的計數器。
當使用帶有 range 的 foreach
時,你必須在 foreach
迴圈中推斷 range
函式的目的。
Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.
LinkedIn