14

刚刚阅读了一篇关于分支预测的精彩文章。我试图用 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 已经内置了分支预测器的优化?

升级版:

我根据注释对代码进行了修改,并在本地机器上测量了时间。

未排序的数组:1.108197927475

排序数组:1.6477839946747

差异:0.539586067。

我认为这种差异用于排序。分支预测器似乎对速度没有影响。

4

1 回答 1

14

你不会在 PHP 中复制它。故事结局。原因是Java RTS 使用JiT 编译技术将Java 中间代码编译为底层X86 顺序代码。此底层订单代码将公开这些分支预测伪像。

PHP 运行时系统将 PHP 编译为字节码,该字节码是被解释的伪机器码。这个解释器将在一个典型的单核上执行大约 0.5M 操作码/秒——也就是说,每个 PHP 操作码可能需要 2-6K 本机指令。分支的任何微妙之处都将在此丢失。

于 2012-07-02T17:44:05.677 回答