在php的分支预测

Via*_*iuk 13 php arrays optimization performance if-statement

刚读一篇关于分支预测的好文章.我试图用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;
?>
Run Code Online (Sandbox Code Playgroud)

但是我总是得到与排序相同的结果,没有它.也许我做错了什么?或者也许php内置了分支预测器的优化?

UPD:

我根据评论进行了代码修改,并在本地计算机上测量时间.

未排序的数组:1.108197927475

排序数组:1.6477839946747

差异:0.539586067.

我认为这种差异花在了排序上.看似分支预测器对速度没有影响.

Ter*_*ryE 14

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

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

  • 乔恩,你的回答没有意义.分支预测_is_在PHP解释器中被利用以加速其性能.但是在订单代码级别`if($ array [$ i] <= 150000)`编译为FETCH_DIM_R,IS_SMALLER_OR_EQUAL,JMPZ代码序列和H/W分支预测不会影响JMPZ执行的运行时. (4认同)