2012-03-04 81 views
-1

此代碼需要15分鐘才能完成,是否有無論如何它可以優化?PHP如何優化此代碼?

<?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; 
?> 
+0

你需要提供的代碼? – christophmccann 2012-03-04 17:17:19

+0

你好:)如果我們能看到代碼,這將會很酷:) – Herr 2012-03-04 17:17:25

+5

這段代碼的目的是什麼? – 2012-03-04 17:18:08

回答

2

在迭代很多次的緊密循環中,預增量會比後增量更快。 並且調用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%的速度。

但是,如果你解釋你實際上想要做的事情 - 看起來你正在努力研究畢達哥拉斯三角形數字 - 也許有更有效的方法比蠻力。

編輯

性能時$目標執行= 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 

,所以你可以看到,後置 - >前增量約0.05秒減少,但將調用的pow()通過做數學直接做出最顯着的區別。

+2

您是否真的有一個源/基準備份前增加速度快於後增量?人們通常認爲它通常不是真的。 – 2012-03-04 17:44:26

+0

我測試了它並證明它是正確的(preincrement不需要存儲到臨時變量,所以減少了這幾個納秒),但在大多數情況下,您不會調用足夠的時間來存在和明顯的差異...用我自己的一些代碼(在這種情況下)增量的數量意味着它是顯而易見的,雖然節省只有幾秒鐘。 powe()函數調用很大的節約。 – 2012-03-04 17:49:36

+0

@Mark Ba​​ker謝謝馬克,我試圖解決這個問題projecteuler.net/problem=86。當然有更優雅的解決辦法,強悍這一點,儘管我擔心我缺乏數學知識來想出這些。事情是我看到C,Java,Python和其他一些與我的非常相似的ppl解決方案,但在一秒之內運行,所以我想知道如果這不是PHP的原因在這裏.. – silkAdmin 2012-03-04 17:50:36