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

Hello :) 코드를 볼 수 있다면 멋질 것입니다 :) – 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 % 빠른 생각합니다.

하지만 실제로하려고하는 것을 설명하면 피타고라스 식 삼각형 숫자를 찾으려는 것처럼 보입니다. 아마 무차별 한 것보다 효율적인 방법이있을 것입니다.

편집

성능 $ 목표와 실행시 = 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 초 감소하지만, 펑에 대한 호출을 교체 수학을 직접함으로써 가장 중요한 차이를 만듭니다.

+2

실제로 백업 할 소스/벤치 마크가 있습니까 그 pre-increment는 post-increment보다 빠릅니까? 종종 그렇다고 생각되지만 대개 실제로 사실이 아닙니다. –

+0

나는 그것을 테스트하고 그것이 사실임을 증명했다. (preincrement는 임시 변수에 저장할 필요가 없으므로 그 몇 나노초를 줄인다.) 그러나 대부분의 경우에는 충분한 시간이 필요하고 눈에 띄는 차이는 없다. ... 내 자신의 코드 중 일부 (이 경우)의 증가량은 눈에 띄지 만 저장하는 데 몇 초 밖에 걸리지 않습니다. 가장 큰 절약은 pow() 함수 호출입니다. –

+0

@ 마크 베이커 감사 마크, 나는이 문제를 해결하려고 노력했다 projecteuler.net/problem=86. 분명히 이것을 더 강압하는 더 우아한 해결책이 있습니다. 비록 제가 수학에 대한 지식이 부족하다는 것을 affraid로 알고 있습니다. 문제는 C, Java, Python 및 다른 일부 ppl 솔루션이 내 것과 매우 유사하며 1 초 미만으로 실행된다는 것입니다. 따라서 PHP가 원인이 아닌지 궁금합니다. – silkAdmin

관련 문제