程序的执行时间为"5E-006" ?

Execution time of program is "5E-006"?

本文关键字:5E-006 执行时间 程序      更新时间:2023-10-16
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"而不是执行时间。为什么?

5e-0065 * 10^-60.000005是一样的。是什么让你认为不是执行时间?

(5e-006是用E表示的数字)

T3是双精度类型,它的值是5微秒,所以没有问题

看一下操纵符。它们用于格式化输出流,以便您可以获得更合理的结果。

5e-006只是5 * 10-6的标准指数符号,即0.000005。

正如其他人已经指出的那样,结果您得到了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微秒来执行。可能是因为您从不使用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和计数(用于某些东西)这么简单,任何少于一百万的东西都是(无用),创建一个派生的实例,并在其上调用run获取以秒为单位的总时间。你可以把它除以如果您想要每次迭代的时间,请计数。

(一个更轻率的答案是程序输出"5e-006",因为编译器坏了。这不是法律