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

请注意,当你在 Web 浏览器中运行代码示例时,你会得到不同的时间结果。我们在 Windows 10 上使用 PHP 8.1.2 执行了上述所有代码示例。

[for 循环和 foreach 循环的可读性]

在可读性方面,你会发现 for 循环比 foreach 循环具有更好的可读性。这是因为,对于 for 循环,你会知道你正在比较一个小于较大数字的计数器。

当使用带有 range 的 foreach 时,你必须在 foreach 循环中推断 range 函数的目的

相关文章
|
3天前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
27天前
|
消息中间件 网络协议 NoSQL
PHP中的异步编程:提高性能与效率的利器
传统的PHP编程方式在处理大量IO密集型任务时效率较低,随着业务的不断扩张和需求的增加,如何提高PHP应用的性能成为了亟待解决的问题。本文将介绍PHP中的异步编程技术,探讨其在提升性能和效率方面的作用,并通过实例演示其在实际应用中的运用。
12 0
|
1月前
|
PHP
php的foreach神操作
php的foreach神操作
22 0
|
1月前
|
PHP 开发者
PHP 8.1 新特性解析:提升开发效率与性能的利器
本文将深入探讨PHP 8.1的新特性,包括联合方法调用、never返回类型、str_contains函数等,展示这些更新如何提升开发者的工作效率和代码性能。
15 1
|
1月前
|
编译器 PHP 开发者
PHP 8 新特性解析:提升性能与安全性
随着技术的不断进步,PHP 8作为一种流行的服务器端脚本语言,在性能和安全性方面有了许多值得关注的新特性。本文将深入探讨PHP 8的一些重要更新,包括Just In Time编译器、Union Types、Named Arguments等,帮助开发者更好地利用这些新功能提升应用程序的性能和安全性。
|
2月前
|
PHP
从建站到拿站 -- PHP判断循环及函数
从建站到拿站 -- PHP判断循环及函数
12 0
|
3月前
|
缓存 弹性计算 NoSQL
您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
【1月更文挑战第12天】【1月更文挑战第57篇】您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
354 1
|
6月前
|
PHP 数据库 索引
PHP中的for循环和forEach循环
PHP中的for循环和forEach循环
|
7月前
|
PHP
PHP 循环的中断和中断层数的含义(continue、break)
PHP 循环的中断和中断层数的含义(continue、break)
41 0
|
8月前
|
PHP
PHP - Laravel 视图模板(blade.php) 循环便利
PHP - Laravel 视图模板(blade.php) 循环便利
90 0