#c #time
#c #время
Вопрос:
У меня есть программа на C с 2 функциями и одной main. Цель программы — посмотреть, какая функция занимает больше времени.
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 amp;amp; 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
Комментарии:
1.
CLOCKS_PER_SEC
зависит от вашего оборудования, но в большинстве современных систем это огромное число. С другой стороны, ваши функции загружают ваш процессор только на несколько тактов
Ответ №1:
Объявление переменной в 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), либо lower_case (в стиле C). Определенного единственно правильного способа не существует, и рекомендации зависят от языка программирования, но вы всегда должны стараться следовать существующим и общим рекомендациям как можно лучше.
Комментарии:
1. Технически, однако, «функция» не является ключевым словом. Но я определенно согласен с той частью, что вы должны программировать на английском. Кроме того, очень редко ваши функции и переменные начинаются с заглавной буквы.
2. Однако это доступно на многих других языках, таких как java, javascript, php и многих других.
3. Достаточно справедливо. Звучит так, как будто вы предполагаете, что это ключевое слово в C .
4. Хорошо и извините за немецкие переменные, не знал, что это раздражает других.
Ответ №2:
Этот код не показывает, что clock
возвращает ноль. Разница между вашими двумя измерениями clock()
равна нулю. Вы измеряете время, необходимое для выполнения операций, которые не занимают много времени, что составляет менее 1 clock
тика.
Отображение clock()
возвращается 42
в t1 = clock();
. Инструкция double Rueckgabezahl;
вообще не занимает времени, поэтому clock
вернет то же значение, что и незадолго до этого. t1 = clock()-t1;
будет эквивалентно тому, t1 = 42 - 42;
откуда вы получаете t1 = 0;
.
Вы можете попробовать использовать std::high_resolution_clock
, но тогда вы даже не сможете получить измерение. Вы будете измерять, сколько времени требуется для считывания часов.
Комментарии:
1. Привет, да, я допустил глупую ошибку, часы должны быть вокруг Rueckgabezahl = Funktion(Zahl); и Rueckgabezahl2 = Funktion2(Zahl);
2. Но даже если я это сделаю, он все равно покажет ноль. Возможно ли, что операция, которая вычисляет циклы for, моды и т.д. Для числа, подобного 6525263652, По-прежнему требует времени, близкого к нулю?
3. Никакое разрешение не может помочь, OP вычисляет время в секундах .
4. оххххххх, теперь я понял
5.
double Rueckgabezahl;
это оператор, а не выражение.