2016-03-20 9 views
2

2番目のコードが最初のコード(6秒と11秒)よりも2倍速い理由を教えてください。(すべてのバージョンで)理由は、関数を使用するか、グローバルなものか何か他のものを使用する理由とその理由です。私は他のスクリプトでこのミスを防止したいですが、私は間違いなく私のミスは何か分かりません。機能を使用するか、グローバルを使用するのに時間がかかりますか?

このスクリプトはオンラインツールで実行しますが、同じ結果が得られます。

プロフィール第一コード: enter image description hereまずコード:

for ($i = 1; $i < 2500; ++$i) { 
    $pen[$i] = $i * (3 * $i - 1)/2; 
} 
function pentagonal($num) { 
    global $pen; 
    return $pen[$num]; 
} 
function is_pentagonal($c) { 
    $x = (1+sqrt(1+24*$c))/(6); 
    if ($x == (int)$x) { 
     return true; 
    } else { 
     return false; 
    } 
} 
for ($i = 2; ; ++$i) { 
    for ($j = 1; $j < $i ; ++$j) { 
     $pi = pentagonal($i); // Here is the difference 
     $pj = pentagonal($j); // Here is the difference 
     if (is_pentagonal($pi + $pj, $pen)) { 
      if (is_pentagonal(abs($pi - $pj), $pen)) { 
       $difference = $pi - $pj; 
       break 2; 
      } 
     } 
    } 
} 
echo $i.' '.$j.' '.$difference."\n"; 

第コード(単に機能を除去し、アレイから直接値を取得):

for ($i = 1; $i < 2500; ++$i) { 
     $pen[$i] = $i * (3 * $i - 1)/2; 
    } 
// function pentagonal($num) { 
//  global $pen; 
//  return $pen[$num]; 
// } 
    function is_pentagonal($c) { 
     $x = (1+sqrt(1+24*$c))/(6); 
     if ($x == (int)$x) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    for ($i = 2; ; ++$i) { 
     for ($j = 1; $j < $i ; ++$j) { 
      $pi = $pen[$i]; // Here is the difference 
      $pj = $pen[$j]; // Here is the difference 
      if (is_pentagonal($pi + $pj, $pen)) { 
       if (is_pentagonal(abs($pi - $pj), $pen)) { 
        $difference = $pi - $pj; 
        break 2; 
       } 
      } 
     } 
    } 
    echo $i.' '.$j.' '.$difference."\n"; 

答えて

3

変数のルックアップ、グローバル動的言語では、通常、テーブル参照(ハッシュルックアップまたはオフセットのいずれか)として実装されます。これは非常に高速です。関数呼び出しは常に「高価」です...実行する必要のある設定とティアダウンコードがある程度あり、これは何千ものマシンコード命令に変換されます。これは、比較として、遅いです。

より大きいシステムで直接変数アクセスによってすべての関数呼び出しを置き換えることは愚かなことでしょう。上記のコードで問題が完全に表現されている場合は、変数に直接アクセスして、コードを完成させてください。

これが大規模なシステムの一部である場合は、関数を使用します。それは、テスト、デバッグ、静的解析、プロファイリング、すべて、...、はるかに簡単になります。コードの最初の変種が2番目の変種の2倍の速さであっても、それが起こっているすべての騒音、特にIOが発生すると、それはかなり損なわれるでしょう。

UPDATE:これはレキシカルスコープ(またはものは何でもそれらはPHPで呼ばれている)を作成しないようになるとあなたは...

function is_pentagonal($c) { 
    $x = (1+sqrt(1+24*$c))/(6); 
    return $x == (int)$x; 

} 

...としてそれを表現することにより、もう少し効率的にあなたの関数を作るかもしれません。

関連する問題