首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:了解分支预测是如何工作的

问PHP:了解分支预测是如何工作的
EN

Stack Overflow用户
提问于 2015-10-04 08:36:26
回答 1查看 91关注 0票数 2

在阅读了分支预测之后,我试着理解它是如何工作的。

我写了一个基本的测试(下面)。

我认为,在第一个循环php知道如何构造数组并预测条件($items[$i] <= 150000)的结果之后,第二个循环的时间与第一个循环相同,似乎没有从分支预测中受益。

一些问题:

  1. 也许php不支持分支预测?
  2. 也许我不懂分支预测?
  3. 我的考试错了/还有其他性能问题吗?

我的测试:

代码语言:javascript
复制
$count = 300000;
$items = array();
$found = 0;

// build array
for ($i = 0; $i <= $count; $i++) {
    array_push($items, rand(0, $i));
}

// first loop with no predication benefit
// ------------------------------------
$time_start = microtime(true);

for($i = 0; $i <= $count; $i++) {
    $found = ($items[$i] <= 150000) ? $found+1 : $found;
}

$time_end = microtime(true);
$time = $time_end - $time_start;
// ------------------------------------

echo "first loop\r\n";
echo 'Found:'. $found . "\r\n";
echo 'End:'  . $time  . "\r\n";

// reset counter
$found = 0;

// second loop with predication benefit
// ------------------------------------
$time_start = microtime(true);

for($i = 0; $i <= $count; $i++) {
    $found = ($items[$i] <= 150000) ? $found+1 : $found;
}

$time_end = microtime(true);
$time = $time_end - $time_start;
// ------------------------------------

echo "second loop\r\n";
echo 'Found:'. $found . "\r\n";
echo 'End:'  . $time  . "\r\n";

输出

代码语言:javascript
复制
first loop
Found:254052
End:0.093052864074707
second loop
Found:254052
End:0.092923879623413

http://codepad.org/Zni0b5rS

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-04 09:29:51

TL;TR

分支预测是一种硬件特性。

在这种情况下,从硬件特性中受益的编程语言是C。(PHP用C编写)。或者真实地说出从PHP的C源编译的机器代码。因此,是的,您已经从分支预测中受益,但这不是您可能想到的方式。

从分支预测中受益的程度要低得多。基本上,您需要知道后续的机器(!)命令在执行之前被加载到CPU的管道中。但是加载命令需要时间。

如果要执行条件跳转命令,则如果条件计算为真,则管道中的后续命令可能不再更新,因为跳转命令告诉CPU继续从(machine(!))中的一个完全不同的位置加载命令。密码-跳转目标-在这种情况下。

这意味着CPU需要刷新现有管道,并使用启动跳转目标位置的命令重新填充管道。如果在该地点有另一个跳跃目标,同样的情况会再次发生。注意,条件跳转是最常见的机器代码命令之一。

也就是说,指挥管线的性能基本上是不够的。

如果CPU可能是智能的,并且猜测条件是否在得到评估之前就计算为true,该怎么办?它可以在将跳转命令加载到管道后立即从该跳转目标加载命令。注意,loads并不等于执行!同样,在计算条件之前,CPU会尝试猜测。如果猜测是错误的,CPU当然仍然需要刷新管道并用正确的命令填充管道。但是,与不去猜测相比,不需要脸红的可能性更大。

实现猜测的算法有多种,从静态方法到动态方法,这些算法考虑到了代码到目前为止所做的事情。他们相当复杂,并达到惊人的高成功率。请回到维基百科,算法在这里解释:

预测器

返回到PHP代码;即使是第一个循环也可能受益于分支预测。

是的,很明显,两个循环都在执行相同的操作,因此只需要执行一次。但是,PHP作为一种解释性的编程语言,对于分析这些硬件特性来说太高了,因为幕后发生的事情太多了。(甚至可能是循环之间的任务切换)。

顺便说一句,如果您用C编写了类似的代码,C编译器可能会选择退出。例如gcc就能发现很多这样的情况。(太棒了!)但是,这种情况已经在编译时发生,甚至在运行时之前也是如此。

如果您愿意分析分支预测,使用汇编语言和GDB调试器可以显示它在实践中的作用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32931599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档