我有一个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
答案 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
,但那时甚至可能无法获得测量结果。您将测量读取时钟需要多长时间。