2014-12-19 3 views
-6

함수의 시간을 적절하게 측정 할 수없는 코드가 있습니다. 여기에서 측정 시간에 대한 게시물의 방향을 사용했습니다. ,하지만 분명히 아닙니다. 제게 도움이되지 않기 때문에 C++의 문서에 대한 링크가 없어도 일부 답장을 보내주십시오.C++ 프로그램 실행 시간 측정

#include <iostream> 
#include<cstdlib> 
#include <ctime> 

using namespace std; 



int ffibr(int n) 
{ 
    if (n<3) 
     return 1; 

    return ffibr(n-1)+ffibr(n-2); 
} 
int ffibi(int n) 
{ 
    int a = 1, b = 1,i; 
    for (i = 3; i <n+1; i++) 
    { 
     int c = a + b; 
     a = b; 
     b = c; 
    } 
    return b; 
} 
int ffibm(int n) 
{ 
    int q11,q12,q21,q22, 
     p11,p12,p21,p22, 
     w11,w12,w21,w22; 

    if(n < 2) return n; 



    q11 = q12 = q21 = 1; 
    q22 = 0; 



    w11 = w22 = 1; 
    w12 = w21 = 0; 

    n--;  

    while(n) 
    { 
     if(n & 1) 
     { 


      p11 = w11*q11 + w12 * q21; 
      p12 = w11*q12 + w12 * q22; 
      p21 = w21*q11 + w22 * q21; 
      p22 = w21*q12 + w22 * q22; 



      w11 = p11; 
      w12 = p12; 
      w21 = p21; 
      w22 = p22; 

     } 

     n >>= 1;  

     if(!n) break; 



     p11 = q11*q11 + q12 * q21; 
     p12 = q11*q12 + q12 * q22; 
     p21 = q21*q11 + q22 * q21; 
     p22 = q21*q12 + q22 * q22; 



     q11 = p11; 
     q12 = p12; 
     q21 = p21; 
     q22 = p22; 

    } 

    return w11; 
} 

int main() 
{ 
    int n; 
    cerr << "Podaj n-ty wyraz ciagu fibonacciego"<<endl; 
    cin >> n; 


    clock_t poczatek, koniec; 
    double czas1=0; 
    poczatek = clock(); 

    for (int i=0; i<1000; ++i) 

     return ffibi(n); 

    koniec = clock(); 
    czas1 = (double)(koniec-poczatek)/(double)(CLOCKS_PER_SEC);/
system("pause"); 



    cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda rekurencyjna to " << ffibr(n)<<endl; 
    cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda iteracyjna to " << ffibi(n)<<endl; 
    cerr << n<<" wyraz ciagu fibonacciego wyliczony metoda macierzy to " << ffibm(n)<<endl; 
    cerr << "Czas trwania funkcji ffibi to " << czas1<<endl; 
    //cerr << "Czas trwania funkcji ffibr to " << czas2<<endl; 


    return 0; 
} 

기능이 작동하지만, 시간의 측정은 아니 잖아이 같은 s 번째 시도 :

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 



int ffibr(int n) 
{ 
    clock_t poczatek, koniec; // graniczne wartości pomiarowe 
    const int ILE = 1000; // liczba powtórzeń mierzonej funkcji 
    poczatek = clock(); // początek pomiaru 

    for (int i = 0; i<ILE; ++i) 
    if (n<3) 
     return 1; 

    return ffibr(n - 1) + ffibr(n - 2); 
    koniec = clock(); // koniec pomiaru 
    double czas1 = (koniec - poczatek)/(CLOCKS_PER_SEC*(double)ILE); 
} 
int ffibi(int n) 
{ 
    int a = 1, b = 1, i; 
    for (i = 3; i <n + 1; i++) 
    { 
     int c = a + b; 
     a = b; 
     b = c; 
    } 
    return b; 
} 
int ffibm(int n) 
{ 
    int q11, q12, q21, q22, // macierz Q 
     p11, p12, p21, p22, // macierz P 
     w11, w12, w21, w22; // macierz W 

    if (n < 2) return n; 

    // ustawiam macierz Q 

    q11 = q12 = q21 = 1; 
    q22 = 0; 

    // w macierzy W tworze macierz jednostkową 

    w11 = w22 = 1; 
    w12 = w21 = 0; 

    n--;  // będzie nam potrzebna n-1 potęga Q 

    while (n) 
    { 
     if (n & 1) 
     { 
      // wykonujemy mnożenie P = W x Q 

      p11 = w11*q11 + w12 * q21; 
      p12 = w11*q12 + w12 * q22; 
      p21 = w21*q11 + w22 * q21; 
      p22 = w21*q12 + w22 * q22; 

      // wynik przenosimy: W = P 

      w11 = p11; 
      w12 = p12; 
      w21 = p21; 
      w22 = p22; 

     } 

     n >>= 1; // usuwamy z n sprawdzony bit 

     if (!n) break; 

     // podnosimy Q do kwadratu: P = Q x Q 

     p11 = q11*q11 + q12 * q21; 
     p12 = q11*q12 + q12 * q22; 
     p21 = q21*q11 + q22 * q21; 
     p22 = q21*q12 + q22 * q22; 

     // wynik przenosimy: Q = p 

     q11 = p11; 
     q12 = p12; 
     q21 = p21; 
     q22 = p22; 

    } 

    return w11; 
} 

int main() 
{ 
    int n; 
    cerr << "Podaj n-ty wyraz ciagu fibonacciego" << endl; 
    cin >> n; 


    cerr << n << " wyraz ciagu fibonacciego wyliczony metoda rekurencyjna to " << ffibr(n) << endl; 
    cerr << n << " wyraz ciagu fibonacciego wyliczony metoda iteracyjna to " << ffibi(n) << endl; 
    cerr << n << " wyraz ciagu fibonacciego wyliczony metoda macierzy to " << ffibm(n) << endl; 
    cerr << "Czas trwania funkcji ffibi to " << czas1 << endl; 
    //cerr << "Czas trwania funkcji ffibr to " << czas2<<endl; 


    return 0; 
} 

I가 무엇이 잘못되었는지 n 개의 아이디어 ...

+0

for 루프에서'return ffibi (n);'가 분명히 매우 잘못되었습니다. –

+0

'기능은 작동하지만 시간 측정이 안됨 '무언가가 작동하지 않을 수있는 많은 방법이 있습니다. 제발 좀 더 구체화 –

+0

그리고 내가 연구를 많이 언급했다. –

답변

2

이 의지 만 종료 For 루프의 첫 번째 반복에 main() :

for (int i=0; i<1000; ++i) 

    return ffibi(n); 

은 그래서 당신은 R 때문에 타이밍 결과를 얻을 수 없습니다 main()의 est는 실행되지 않습니다.

변경이 : 예컨대하는

for (int i=0; i<1000; ++i) 
{ 
    volatile int result = ffibi(n); 
} 

volatile의 사용은 중복 루프를 멀리 최적화에서 컴파일러를 방지 할 수 있습니다.

+1

왜 익명 다운 - 투표, 나는 궁금해? –

+0

첫 번째 코드 세그먼트에는 true이고 두 번째 루프에는 return이 없습니다. 아마도 오타 일뿐입니다. –

+1

@SebastianLange : 두 번째 함수는'int ffibr (int n)'함수의'koniec = clock();'명령문보다 먼저 복귀합니다. – stefaanv