C ++ clock () возвращает только ноль - PullRequest
0 голосов
/ 14 марта 2019

У меня есть программа на 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 ]

3 голосов
/ 14 марта 2019

Объявление переменной в 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;

Но даже тогда вы не получите впечатляющих результатов. ЦПУ практически ничего не делает в вашем коде, поэтому вам может потребоваться использовать часы с более высоким разрешением для получения измеримых результатов. Или, вы знаете, зацикливание кода вашей функции 100000 раз или около того. Но даже если вы это сделаете, так как вы переводите свое время в секунды, прежде чем печатать его ... вы все равно получите 0 секунд в результате. Вам также придется отключить оптимизацию, потому что в противном случае вызов метода 100000 раз, скорее всего, не даст никакого эффекта, поскольку он просто оптимизирован.

В качестве примечания: как правило, не рекомендуется использовать имена переменных, которые переводятся в ключевые слова, такие как 'Funktion' (~ функция). Кроме того, вам, вероятно, следует полностью перейти на английские имена. Я никогда не видел, чтобы проект на самом деле использовал немецкие имена переменных, и мне это кажется очень странным, не говоря уже о том, что он запрещен, если вы сотрудничаете с другими людьми, которые, возможно, не говорят на нем. Кроме того (и это относится не только к C ++, имена переменных, как правило, будут либо camelCase (в стиле Java), либо в нижнем регистре (в стиле C). Не существует однозначного правильного способа, и рекомендации зависят от языка программирования, но вы должны всегда старайтесь как можно лучше следовать существующим и общепринятым правилам.

1 голос
/ 14 марта 2019

Этот код не показывает, что clock возвращает ноль.Это разница между вашими двумя измерениями clock(), которая равна нулю.Вы измеряете время, которое требуется для выполнения операций, которые не занимают времени, которое составляет менее 1 clock тика.

Imaging clock() возвращает 42 при t1 = clock();.Оператор double Rueckgabezahl; совсем не требует времени, поэтому clock вернет то же значение, что и раньше.t1 = clock()-t1; будет эквивалентно t1 = 42 - 42;, откуда вы получите t1 = 0;.

Вы можете попробовать использовать std::high_resolution_clock, но вы даже не сможете получить измерениезатем.Вы будете измерять, сколько времени займет чтение часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...