2012-03-04 5 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

+0

こんにちは:)私たちもコードを見ることができればクールです:) – Herr

+5

このコードの目的は何ですか? –

答えて

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%高速だと思います。

実際に何をしようとしているのかを説明すれば、あなたはピタゴラスの三角形の数を計算しようとしているように見えます。おそらく、ブルートフォースよりも効率的な方法があります。

EDIT

パフォーマンス$目標= 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 

SOあなたがそのポストインクリメントを見ることができます - >前置インクリメントは、約0.05秒で減少しますが、捕虜への呼び出しを置き換えます()数学を直接行うことで、最も大きな違いが生じます。

+2

バックアップするソース/ベンチマークは実際にありますかそのプリインクリメントはポストインクリメントより速いのですか?それはしばしば実際には真実ではないと考えられています。 –

+0

私はそれをテストし、それが事実であることを証明しました(preincrementは一時変数に保存する必要がなくなり、数ナノ秒に短縮されます)。しかし、ほとんどの場合、 ...私のコードのいくつか(そしてこの場合)は、保存がわずか数秒であるにもかかわらず、それが顕著であることを意味します。大きな節約はpow()関数呼び出しです。 –

+0

@マーク・ベイカーありがとう、私はこの問題projecteuler.net/problem=86を解決しようとしていました。確かにこれを強制するよりエレガントなソリューションですが、私はaffraid私はこれらを思い付く数学的な知識が不足していますが。私はC、Java、Pythonなどの他のpplソリューションを見ていますが、それは私のものに非常によく似ていますが、2番目に実行されるので、PHPが原因ではないのだろうかと疑問に思っていました.. – silkAdmin