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