PHP 中 for 迴圈和 foreach 迴圈的效能和可讀性

Habdul Hazeez 2023年1月30日
  1. for 迴圈和 foreach 迴圈與範圍
  2. 帶有字尾和字首增量的 for 迴圈
  3. 帶有 count 函式的 for 迴圈
  4. 沒有鍵的 foreach 和有鍵的 foreach
  5. 帶有 count 函式的 for 迴圈和帶有鍵和值的 foreach
  6. 帶有 countforeachfor 迴圈沒有鍵
  7. 帶有 countfor 迴圈和帶有範圍的 foreach
  8. for 迴圈和 foreach 迴圈的可讀性
PHP 中 for 迴圈和 foreach 迴圈的效能和可讀性

本文對 PHP 中的 for 迴圈和 foreach 進行了比較。該比較旨在確定哪個迴圈具有更快的執行速度和更好的可讀性。

for 迴圈和 foreach 迴圈與範圍

我們在十萬次迭代中比較了 for 迴圈和 foreach 迴圈與 range。測試結果表明 for 迴圈比 foreach 迴圈執行得更快。

原因是 for 迴圈通過增加整數值來進行比較。相比之下,foreachrange 必須在提取每個元素並檢查陣列末尾之前建立一個陣列。

<?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

帶有 countforeachfor 迴圈沒有鍵

帶有 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

帶有 countfor 迴圈和帶有範圍的 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
Habdul Hazeez avatar Habdul Hazeez avatar

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

相關文章 - PHP Loop