2014-12-19 5 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; 
} 

функции работают, но измерение времени don't.I также пытался что-н так:

#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; 
} 

У меня есть русская идея, что это неправильно ...

+0

'return ffibi (n);' в вашем цикле for явно не так. –

+0

'функции работают, но измерение времени не существует. Существует много способов, в которых что-то может не работать. Пожалуйста, будьте более конкретным –

+0

, и, как я уже упоминал, я сделал много исследований. –

ответ

2

Это будет просто выйти main() на первой итерации цикла для:

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

    return ffibi(n); 

так что вы не получите результат синхронизации, так как г est main() даже не выполняется.

Изменить его т.д .:

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

Обратите внимание на использование volatile, чтобы предотвратить компилятор от оптимизации прочь резервную петлю.

+1

Почему анонимный голос, интересно? –

+0

Истина для первого сегмента кода, но вторая не имеет цикла возврата. Наверное, просто опечатка. –

+1

@SebastianLange: у второго есть возврат перед 'koniec = clock();' statement в функции 'int ffibr (int n)' – stefaanv

Смежные вопросы