【问题标题】:Unused foreach loop performance impact?未使用的 foreach 循环性能影响?
【发布时间】:2014-01-21 13:54:57
【问题描述】:

我有一个关于 foreach 循环的问题,它与我正在使用 DOM 开发的情景 XML 解析器有关(本质上,它在 XML 中查找一些硬编码的值)。有谁知道实际上没有被调用的 foreach 循环对系统性能的影响?

仅供参考,我正在查看至少两种离散类型的 XML 文件,每种类型本身都有许多循环,我想使用相同的解析文件来查看每个文件。

因此,例如,它会查看具有一个功能的树,然后查看具有另一个功能的树。运行一个 .php 文件会产生什么结果,该文件包含响应两者的信息,但只是适当地选择一个或另一个?

例如,如果我调用 foreach($foo as $bar),但没有 $bar,那么将在 foreach 循环中运行的代码会发生什么?我很确定它会输出一个错误(尽管这会在报告方面被抑制),但是 PHP 的性能会因为它解析其中的代码而受到影响吗?

我可能有点不清楚;我可能在某处使用了错误的术语,所以我将做一个总结:

涉及不存在的关联数组的 foreach 循环是否会对性能产生影响。

作为参考,我想做一些类似于本页清单 2 下示例的操作:http://www.ibm.com/developerworks/library/os-xmldomphp/

如果输入“清单 2”示例的 XML 文件中没有书籍,是否会出现重大问题,或者 PHP 是否会很好地继续前进(对我而言,非致命错误也很重要),或者会性能受到影响?

【问题讨论】:

  • “如果我调用 foreach($foo as $bar),但没有 $bar”——这没有任何意义。 $bar 之所以出现,只是因为 foreach 循环正在对数据进行操作。您可能意思是如果$foo 是一个空数组怎么办。
  • 和往常一样:您在这里关心的是“微优化”,在 99.999…99% 的实际用例中根本不会产生任何相关的差异。
  • 以两种方式实施,衡量差异,然后选择适合您的性能要求的方法。
  • 也许我应该更清楚一点,我实际上将使用关联数组。我不确定这有什么区别(如果有的话),但我有 20/30 基于案例的 foreach 循环,即“foreach 对象作为对象 => 要求”。至于进行手动测试,我主要担心的是我真的不知道我的最终性能要求可能是什么,我也没有足够的经验知道我的测试是真正严格的。我希望开发一些其他人可能会在他们自己的服务器上使用的东西,这可能是完全不同的环境。
  • 如果您没有明确的性能要求,那么性能可能是在其他约束条件下最好的。例如,通常提高性能会降低可维护性,并且可能不希望(缺少需求)降低可维护性以实现边际性能改进。

标签: php performance loops foreach


【解决方案1】:

我对这种情况的理解是,它永远不会真正进入 foreach() 循环以用于执行目的。

但是,代码实际占用磁盘空间的字节数会被加载到内存中,这样如果你成功输入foreach()就可以处理它

我个人在一个所有错误都会出现的环境中进行开发,这样我就可以确保我的代码在生产环境中是坚如磐石的。

如果我期待一个数组或对象,那么我通常会实现这个:

// check for the existence of $foo and make sure it is loop-able
// being loop-able means $foo is either and array or object and contains at least one item/element
if((is_array($foo) || is_object($foo)) && count($foo) > 0)
{
    foreach($foo as $bar)
    {
    }
}

总体而言,您的问题/疑虑符合微优化,当您进行微优化时,没有人会获胜。只需确保您的代码对未来的开发人员来说易于理解,并在必要时对其进行重构。

【讨论】:

  • 我不确定我是否完全理解这一点;我们是在检查以确保至少有一个 $foo 数组,还是应该检查是否有 $bar 项目?
  • 伪代码:if ($foo is an array with at least one element) then foreach ($foo as $bar) { }
  • 是的,请确保$foo 在尝试循环之前至少包含一项,这只是为了避免错误。如果关闭错误报告,则可以完全避免看到错误,但在开发代码时绝对不建议这样做。
  • 在学习 PHP 时使用此代码剖析数组/对象:echo '<div style="background-color:white; padding:15px;"><pre>'.print_r($foo, true).'</pre></div>';
  • 啊,我现在明白了。早餐(和解释)对我理解代码的作用令人惊讶。另外,我需要停止像英语老师那样思考数组。因此,如果我想递归检查对象,我可以定义数组;例如,如果我有一个 3 元素(这完全是任意的),我可以有如下内容:
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多