在阅读了分支预测之后,我试着理解它是如何工作的。
我写了一个基本的测试(下面)。
我认为,在第一个循环php知道如何构造数组并预测条件($items[$i] <= 150000)的结果之后,第二个循环的时间与第一个循环相同,似乎没有从分支预测中受益。
一些问题:
我的测试:
$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";输出
first loop
Found:254052
End:0.093052864074707
second loop
Found:254052
End:0.092923879623413发布于 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调试器可以显示它在实践中的作用。
https://stackoverflow.com/questions/32931599
复制相似问题