刚刚读了一篇很棒的文章分支预测 https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array。我试图使用 php 语言重现它。
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$count = 300000;
$sum = 0;
for ($i = 0; $i <= $count; $i++) {
$array[] = rand(0, $count);
}
sort($array);
for ($i = 0; $i <= $count; $i++) {
if ($array[$i] <= 150000) {
$sum += $array[$i];
}
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo $sum . '<br />';
echo 'End:' . $time;
?>
但无论有排序还是没有排序,我总是得到相同的结果。也许我做错了什么?或者也许 php 已经内置了分支预测器的优化?
UPD:
我根据注释修改了代码并在本地机器上测量了时间。
未排序的数组: 1.108197927475
排序数组: 1.6477839946747
不同之处:0.539586067。
我认为这个差异花在了排序上。看来分支预测器对速度没有影响。
您不会在 PHP 中复制此内容。故事结局。原因是Java RTS使用JiT编译技术将Java中间代码编译为底层的X86顺序代码。该底层订单代码将暴露这些分支预测伪影。
PHP 运行时系统将 PHP 编译为字节码,字节码是可解释的伪机器代码。该解释器将在典型的单核上执行大约 0.5M 操作码/秒——也就是说,每个 PHP 操作码可能需要 2-6K 本机指令。任何分支的微妙之处都将在此丢失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)