C 时钟()仅返回零

C++ clock() only returns zero

本文关键字:返回 时钟      更新时间:2023-10-16

我有一个具有2个功能的C 的程序。该程序的目标是查看哪个功能需要更多的时间。

ps:代码执行以下操作:您输入一个数字" n",并且该程序将每个数字少或等于" n",这些数字可以由5或3分组。

例如。n =15。总和= 15 12 10 9 6 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()测量了时间(tick),然后(在功能之后)我测量了该功能所采用的滴答(t1 = clock() - t1)。

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

我的错误是什么?

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

问候Q

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'(〜函数)。另外,您可能应该切换到Alltogether的英文名称。我从未见过一个实际使用德语变量名称的项目,这对我来说似乎很奇怪,更不用说如果与其他可能不会说话的人合作是不做的。此外(而且这不仅适用于C ,变量名称通常是骆驼箱(Java style)或Lower_case(C风格)。没有确定的正确方法,建议取决于编程语言,但您应该始终始终尝试尽可能地遵循现有和常见的准则。

此代码没有显示 clock返回零。clock()的两个测量值是零。您正在测量执行不需要时间的操作所需的时间,该操作小于1 clock tick。

成像clock()t1 = clock();返回42。语句double Rueckgabezahl;根本不需要时间,因此clock将返回与以前相同的值。t1 = clock()-t1;等于t1 = 42 - 42;,您可以从中获得t1 = 0;的位置。

您可以尝试使用std::high_resolution_clock,但是您甚至可能无法进行测量。您将衡量阅读时钟需要多长时间。