PHP如何优化此代码?

时间:2012-03-04 17:16:36

标签: php optimization

此代码需要15分钟才能完成,无论如何它可以优化吗?

<?php 
$base = 99;
$results = 1975;
$goal = 1000001;
while ($results <= $goal)
{   

    for ( $i=0; $i <= $base; $i++ )
    {
        for ( $j=$i+1; $j <  $base ; $j++  )
        {   

            $hypo = sqrt(( pow($i + $j, 2) )+ pow($base, 2));                   

            if ($hypo == (int) $hypo )
            {
                if ($results == $goal)  
                {
                    echo $i, ' ', $j, ' ',$base , '
';
                    break 3;
                }  
                else
                {
                    $results++;
                }
            }
        }       
    }
    $base++;    
}
echo $base;
?>

1 个答案:

答案 0 :(得分:2)

在一个经过多次迭代的紧密循环中,preincrement将比postincrement更快。 并且调用pow()具有函数调用的开销,更快地直接进行数学运算。

$base = 99;
$results = 1975;
$goal = 1000001;
while ($results <= $goal)
{

    for ( $i=0; $i <= $base; ++$i )
    {
        for ( $j=$i+1; $j <  $base ; ++$j )
        {

            $hypo = sqrt(( ($i + $j) * ($i + $j) ) + ($base * $base));

            if ($hypo == (int) $hypo )
            {
                if ($results == $goal)
                {
                    echo $i, ' ', $j, ' ',$base , '
';
                    break 3;
                }
                else
                {
                    ++$results;
                }
            }
        }
    }
    ++$base;
}
echo $base;

由于迭代次数很多,但仍然不会很快,但这两个小的改动应该会减少非常显着的时间......想想快50%-75%。

但如果你解释一下你实际上要做什么 - 看起来你正试图找出毕达哥拉斯三角形数字 - 也许有比蛮力更有效的方法。

修改

使用$ goal = 10001执行时的效果:

Call time for postincrement and pow() method was 12.4709 seconds
Call time for preincrement and pow() method was 12.4239 seconds
Call time for preincrement method and multiply was 4.9315 seconds

所以你可以看到后增量 - &gt; preincrement减少约0.05秒,但通过直接数学替换对pow()的调用会产生最显着的差异。