PHP 碰到不确定预测 条件分支预测错误会有性能惩罚 使用条件传送更好

 

 

 

function minmax1(array $a,array $b,int $n)
{
    for($i=0;$i<$n;$i++)
    {
        if($a[i] >$b[i])
        {
            $t = $a[i];
            $a[$i] = $b[$i];
            $b[$i] = $t;
        }
    }
}

function minmax2(array $a,array $b,int $n)
{
    for($i=0;$i<$n;$i++)
    {
        $min = $a[$i]<$b[$i] ? $a[$i] : $b[$i];
        $max = $a[$i]<$b[$i] ? $b[$i] : $a[$i];
        $a[$i] = $min;
        $b[$i] = $max;
    }
}

function merge1(array $src1,array $src2,array $dest=[],int $n)
{
    $i1 = 0;
    $i2 = 0;
    //$id = 0;
    while($i1<$n && $i2 < $n)
    {
        if($src1[$i1] < $src2[$i2])
        {
            $dest[] = $src1[$i1++];
        }
        else
        {
            $dest[] = $src2[$i1++];
        }
    }
    
    while($i1<$n)
    {
        $dest[] = $src1[$i1++];
    }
    
    while($i2<$n)
    {
        $dest[] = $src2[$i2++];
    }
    
}

function merge2(array $src1,array $src2,array $dest=[],int $n)
{
    $i1 = 0;
    $i2 = 0;
    //$id = 0;
    while($i1<$n && $i2 < $n)
    {
        $dest[] = $src1[$i1]< $src2[$i2] ? $src1[$i1++]:$src2[$i2++];
    }
    
    while($i1<$n)
    {
        $dest[] = $src1[$i1++];
    }
    
    while($i2<$n)
    {
        $dest[] = $src2[$i2++];
    }
    
}



function buildData(int $len)
{
    $ret = [];
    if($len>0)
    {
        for($i=0;$i<$len;$i++)
        {
            $ret[] = mt_rand(0,1000); 
        }
    }
    return $ret;
}

$a = new PerformanceTest();
$num = 1000;
$v1= buildData($num);
$v2= buildData($num);
$count = 0;
$count1 = 0;
$loop = 0;
Loop:
$a->begin();
minmax1($v1,$v2,$num);
$a->end();
$a1=$a->getSpentTime();
$a->begin();
minmax2($v1,$v2,$num);
$a->end();
$a2=$a->getSpentTime();
$a->begin();
merge1($v1,$v2,[],$num);
$a->end();
$a3=$a->getSpentTime();
$a->begin();
merge2($v1,$v2,[],$num);
$a->end();
$a4=$a->getSpentTime();
if($a2<$a1)
{
    $count++;
}
if($a4<$a3)
{
    $count1++;
}
if($loop<100)
{
    $loop++;
    goto Loop;
}
var_dump($count);
var_dump($count1);
//int(101) int(82)  第一个性能永远是最好的估计是根据数据关键路径有关  最后一个性能根据分支预测的正确性而改变
exit;

 

posted on 2017-07-17 11:30  小乔流水人家  阅读(244)  评论(0)    收藏  举报

导航