2014-10-23 3 views
0

여기서 동일한 결과를 수득 2 개 코드 동안 : 코드 1최적화

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    int res, nbMax = 0, i; 
    unsigned long j; 
    for (i = 1; i <= 1000000; i++) { 
     j = i; 
     int nb = 1; 
     while (j != 1) { 
      nb++; 
      if (j % 2 == 0) { 
       j = j/2; 
      } else { 
       j = 3 * j + 1; 
      } 
     } 

     if (nb > nbMax) { // <- 
      nbMax = nb; 
      res = i; 
     } 
    } 
    printf("longest: %d (%d)\n", res, nbMax); 
    return 0; 
} 

코드 2 :

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    int res, nbMax = 0, i; 
    unsigned long j; 
    for (i = 1; i <= 1000000; i++) { 
     j = i; 
     int nb = 1; 
     while (j != 1) { 
      nb++; 

      if (nb > nbMax) { // <- 
       nbMax = nb; 
       res = i; 
      } 
      if (j % 2 == 0) { 
       j = j/2; 
      } else { 
       j = 3 * j + 1; 
      } 
     } 

    } 
    printf("longest: %d (%d)\n", res, nbMax); 
    return 0; 
} 

diference은 주석 블록 (IF)이다. 첫 번째 시간은 두 번째 while 루프 외부와 두 번째 내부입니다. 첫 번째 알고리즘은 두 번째 알고리즘보다 더 빠릅니다. 두 번째 알고리즘에서 해당 범위가 더 많이 실행되기 때문입니다. 그러나 첫 번째 시간은 1 초, 0.9는 두 번째 시간이됩니다 ... 어떻게 두 번째 algoirthm이 첫 번째 것보다 빠를 수 있습니까 ??

EDIT. MinGW (4.7.1)에서 작동합니다. Windows 8.1 인텔 i7-4500

+0

재현 할 수 없습니다. amd64 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2에서 -O3을 사용하면 첫 번째 코드는 0.30 초에서 두 번째 코드는 0.33 초까지 실행됩니다. –

+0

동일, 내 마지막에 재현 할 수 없다 : 코드 1 : 컴파일 시간 : 0.13 초, 절대 실행 시간 : 0.35 초, CPU 시간 : 0.22 초, 메모리 피크 : 3Mb, 절대 서비스 시간 : 0.48 초' ------------------------------------------------- ------------------------------------------------ 'cod2 : 컴파일 시간 : 0.13 초, 절대 실행 시간 : 0.45 초, CPU 시간 : 0.38 초, 메모리 피크 : 3Mb, 절대 서비스 시간 : 0.58 초' http://rextester.com/ 실행 코드 –

+0

어떤 최적화를 사용하고 있습니까? – Surt

답변

0

여기에서 재현 할 수는 없지만 작업중인 플랫폼과 컴파일러에 따라 다릅니다. 최적화 알고리즘을 컴파일러에서 사용하면 코드의 일부가 변경 될 수 있습니다. 무언가가 당신의 코드에 영향을 미치지 않는다면, 루프를 벗어나거나, 컴파일하는 동안 최적화 단계에서 코드에서 생략 될 수도 있습니다. 일부 통찰력을 얻으려면 루프 최적화에서 컴파일러 최적화 기법을 확인할 수 있습니다.