double SumOfSquare()()
{
int i;
double T3,total=0;
for(i=0;i<200;i++) {
clock_t start = clock();
int n=100,sum=0;
for(int i =1;i<=n;i++) {
sum=sum+i*i;
}
clock_t end = clock();
T3=double(end-start)/(double) CLOCKS_PER_SEC;
total=total+T3;
}
T3=total/200;
return T3;
}
int main()
{
double T3=SumOfSquare();
cout<<T3<<endl;
return 0;
}
此代码应返回该代码执行时间的值,而不是返回一些奇怪的输出,例如“5e-006”而不是执行时间。为什么呢?
答案 0 :(得分:6)
5e-006
与5 * 10^-6
或0.000005
相同。是什么让你认为不是执行时间?
(5e-006
是用E notation写的数字。)
答案 1 :(得分:4)
T3是一个双倍,它的值是5微秒,所以没有错。
答案 2 :(得分:2)
看看操纵者。它们用于格式化输出流,因此您可以获得更明智的结果。
答案 3 :(得分:2)
5e-006简单地是5 * 10 -6 的标准指数表示法,即0.000005。这与6μs相同。
答案 4 :(得分:2)
正如其他人已经指出的那样,你得到5微秒的结果,这似乎至少是合理的时间。
然而,我会以稍微不同的方式计算时间。我会积累循环的“滴答”数,然后将总数转换为秒:static const int iterations = 200;
clock_t total=0;
double seconds;
for(i=0;i<iterations;i++) {
clock_t start = clock();
int n=100,sum=0;
for(int i =1;i<=n;i++) {
sum=sum+i*i;
}
total += clock() - start;
}
return total/double(CLOCKS_PER_SEC*iterations);
每次迭代都不是浮点除法和浮点加法,而是在每次迭代时进行整数加法,并在最后进行单个浮点除法。在低端硬件上,这可能会更快。更重要的是,它可能更准确,几乎与硬件无关 - 在浮点中添加一长串小数字是经常导致精度大幅下降的情况之一。
答案 5 :(得分:0)
显而易见的答案是您的代码只需要5微秒
执行。可能是因为你从不使用sum
,所以
编译器将消除用于修改其值的任何代码(和
因此内循环)。最重要的是,你的测量
可能由clock
的粒度决定。你也是
想要在尽可能大的时间内衡量:我会
如果对clock
的两次呼叫都是可疑的
一部分不到5分钟(但当然,我会用很多
调试程序时间隔较短:-))。我的解决方案
(而且我并不是说它是完美的)一般都是这样的
要在虚函数中,在派生类中测量的代码,
与基类中的函数无关,什么的
像:
class Base
{
static int ourCount;
static double ourTare;
virtual void doRun();
public:
double run();
static void setCount( int count );
};
int Base::ourCount = 0;
double Base::ourTare = 0.0;
void Base::doRun() {}
double Base::run()
{
clock_t start = clock();
for ( int count = ourCount; count > 0; -- count )
doRun();
clock_t end = clock();
return (static_cast<double>(end - start) / CLOCKS_PER_SEC - ourTare;
}
void Base::setCount( int count )
{
ourCount = count;
ourTare = 0.0;
// The following has been sufficient in the past. If the
// compiler inlines Base::run, however, it could be
// insufficent. (In my own code, Base::run is in a
// separate translation unit.)`
ourTare = Base().run();
}
class Derived
{
int d;
virtual void doRun();
public:
};
void Derived::doRun()
{
int sum = 0;
for ( int i = 1; i <= 100; ++ i ) {
sum += i * i;
}
d = sum;
}
然后用计数调用Base::setCount
(对于某事
像这样简单,任何不到一百万的东西都是
无用),创建一个Derived实例,并在其上调用run
以秒为单位获取总时间。你可以把它分开
如果你想要每次迭代的时间,请计算。
(一个更轻率的答案是程序输出
"5e-006"
因为编译器坏了。那不合法
输出C ++中的任何浮点值。)