为什么foreach这么慢?

Mat*_*chu 2 php performance foreach

PHPBench.com在每个页面加载上运行快速基准脚本.在foreach测试中,当我加载它时,foreach运行时间比第三个例子长4到10倍.

为什么本地语言结构显然比执行逻辑更慢?

Pas*_*TIN 9

也许它与foreach在数组副本上工作的事实有关?

或者它可能与以下事实有关:当使用foreach循环时,在每次迭代时,内部数组指针被更改,指向下一个元素?

引用foreach手册页的相关部分:

注意:除非引用了数组,否则foreach将对指定数组的副本进行操作,而不是数组本身.foreach对数组指针有一些副作用.


据我所知,你链接到的第三个测试没有做这两件事 - 这意味着两个测试都没有做同样的事情 - 这意味着你没有比较两种编写相同代码的方式.

(我也会说这种微优化在实际应用中根本不重要 - 但我想你已经知道了,只是出于好奇而被问到)

在这个测试中还有一件事感觉不对:它只进行一次测试; 对于"更好"的测试,不止一次测试所有这些测试可能是有用的 - 时间大约为100微秒,不需要太多就可以产生巨大的差异.
(考虑到第一次测试在几次刷新后在300%到500%之间变化......)


对于那些不想点击的人来说,这是第一次测试(我得到了3xx%,443%和529%):

foreach($aHash as $key=>$val) {
    $aHash[$key] .= "a";
}
Run Code Online (Sandbox Code Playgroud)

第三个(100%):

$key = array_keys($aHash);
$size = sizeOf($key);
for ($i=0; $i<$size; $i++) {
    $aHash[$key[$i]] .= "a";
}
Run Code Online (Sandbox Code Playgroud)

  • 您是否了解了PHP变量处理的工作原理?http://derickrethans.nl/talks/phparch-php-variables-article.pdf (2认同)