程序的执行时间是“5E-006”?

时间:2011-05-02 14:52:10

标签: c++ time double

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”而不是执行时间。为什么呢?

6 个答案:

答案 0 :(得分:6)

5e-0065 * 10^-60.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 ++中的任何浮点值。)