C ++ Clock()仅返回零

时间:2019-03-14 20:43:12

标签: c++ time

我有一个C ++程序,带有2个函数和一个主要函数。该程序的目标是查看哪个功能需要更多时间。

PS:该代码执行以下操作:输入一个数字“ n”,程序将求和的每个小于或等于“ n”的数字都可以被5或3整除。

例如n =15。总和= 15 + 12 + 10 + 9 + 6 + 5 + 3 = 60

    #include <iostream>
    #include <math.h>
    #include <cmath>
    #include <time.h>
    #include <stdio.h>

    using namespace std;

    double Funktion(double Wert){
        double Summe = 0;
        int Index;
        bool Wiederholung;
        for(Index = Wert;Index >= 3;Index--){
            if(Index % 3 == 0)
            {
                Summe = Summe + Index;
                Wiederholung = false;
            }
            if(Index % 5 == 0 && Wiederholung == true)
            {
                Summe = Summe + Index;
            }
            Wiederholung = true;
        }
    return Summe;
    }

    double Funktion2(double Wert){
        double Summe = 0;
        int Abweichung1 = std::fmod(Wert,3);
        int Abweichung2 = std::fmod(Wert,5);
        int Abweichung3 = std::fmod(Wert,15);
        double Wert_3;
        double Wert_5;
        double Wert_15;

        Wert_3 = Wert - Abweichung1;
        Wert_5 = Wert - Abweichung2;
        Wert_15 = Wert - Abweichung3;

        Summe = (Wert_3+3)*((Wert_3/3)/2);
        Summe = (Wert_5+5)*((Wert_5/5)/2)+Summe;
        Summe = Summe-(Wert_15+15)*((Wert_15/15)/2);

        return Summe;
    }

    int main()
    {
        double Zahl;

        cout << "Welche Zahl wollen Sie aufsummieren lassen?: ";
        cin >> Zahl;

        clock_t t1;
        clock_t t2;

        double Rueckgabezahl;
        double Rueckgabezahl2;

        t1 = clock();
        Rueckgabezahl = Funktion(Zahl);
        t1 = clock()-t1;
        t2 = clock();
        Rueckgabezahl2 = Funktion2(Zahl);
        t2 = clock()-t2;

        cout << endl << std::fixed << "Aufsummierte Zahl (mit Loop): " << Rueckgabezahl << endl;
        printf("Zeit (in sek): %f", ((float)t1)/CLOCKS_PER_SEC);

        cout << endl << endl << std::fixed << "Aufsummierte Zahl (ohne Loop): " << Rueckgabezahl2 << endl;
        printf("Zeit (in sek): %f", (float)t2/CLOCKS_PER_SEC);

    }

我研究了有关如何通过clock_t建立时间计数器的多个示例。首先,我建立了一个clock_t t1,然后用t1 = clock()测量了时间(滴答),然后(在函数之后)我测量了该功能花费了多少滴答声(使用t1 = clock()-t1)。 >

在其他项目中,此方法有效。但是以某种方式在此特定代码中并非如此。它总是返回0.00000。

我怎么了?

如果您有任何问题,请随时提问。

关于Q

2 个答案:

答案 0 :(得分:3)

C ++中的变量声明不需要任何时间。 因此,无论您写

t1 = clock();
double Rueckgabezahl;
t1 = clock()-t1;

或仅t1 = clock()-clock()的结果相同。

您最有可能尝试测量的是:

clock_t t1, t2;
double Rueckgabezahl, Ruckgabezahl2;
t1 = clock();
Rueckgabezahl = Funktion(Zahl);
t1 = clock()-t1;
t2 = clock();
Rueckgabezahl2 = Funktion2(Zahl);
t2 = clock()-t2;

但是即使那样,您也不会得到任何令人印象深刻的结果。 CPU在代码中几乎没有任何实际操作,因此您可能需要使用更高分辨率的时钟才能获得可测量的结果。或者,您知道,将您的功能代码循环100000次左右。但是,即使您这样做,由于将时间浪费在打印前的秒数上,结果还是会得到0秒。您还必须关闭优化,因为否则调用方法100000次将很可能没有效果,因为它刚刚被优化掉了。

作为旁注:通常不建议使用转换为关键字的变量名,例如'Funktion'(〜function)。同样,您可能应该一起切换到英文名称。我从未见过一个项目实际上使用德语变量名,这对我来说似乎很奇怪,更不用说如果与其他可能不会说的人合作,那是不行的。此外(这不仅适用于C ++,变量名通常为camelCase(Java样式)或lower_case(C样式)。没有确定的正确方法,建议取决于编程语言,但您应始终尽力遵循现有和通用准则。

答案 1 :(得分:1)

此代码未显示clock返回零。 clock()的两次测量之间的差为零。您正在测量执行没有时间的操作所花费的时间,该时间少于1 clock滴答声。

成像clock()42返回t1 = clock();。语句double Rueckgabezahl;完全没有时间,因此clock将返回与之前相同的值。 t1 = clock()-t1;等同于t1 = 42 - 42;,这是您从中获得t1 = 0;的地方。

您可以尝试使用std::high_resolution_clock,但那时甚至可能无法获得测量结果。您将测量读取时钟需要多长时间。