c ++测量程序执行的时间

时间:2014-12-19 09:53:23

标签: 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;
}

功能起作用,但是时间的测量不是。我也尝试过这样的事情:

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

我知道出了什么问题......

1 个答案:

答案 0 :(得分:2)

这将在for循环的第一次迭代中退出main()

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

    return ffibi(n);  

所以你不会得到时间结果,因为main()的其余部分甚至都没有被执行。

将其更改为例如:

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

请注意使用volatile来阻止编译器优化冗余循环。