具有相同输出和迭代次数的For循环在执行时间上有所不同

时间:2016-04-06 17:43:00

标签: c loops

为什么第一个循环比第二个循环快?

对我来说,第二个循环似乎更便宜,因为身体中没有数学表达式来计算。但是对于第二个循环,我仍然在spoi.com(AP2)上超过了时间限制。然而,第一个循环确实被接受了。

两个for循环都打印相同的有限算术级数。例如:

1 3 5 7 9 11 13 15

假设:

long long n; // number of members in series ( 8 in above example )
long long d; // constant distance between the members ( 2 in example )
long long start; // first member in series ( 1 )
long long end; // last member in series ( 15 )

第一循环:

for(long long i = 0; i < n; i++)
        printf("%lld ", start+(i*d));

第二次循环:

for(long long i = start; i <= end; i+=d) 
        printf("%lld ", i);

我的想法:

在我看来,增加1和第一个循环中的乘法比第二个循环中d的增量要便宜,因为GCC对表达式进行了一些优化?

所以,我使用下面的代码在我的计算机上做了一个“基准测试”,我不能说哪个循环更快。这是相当随意的。

所以现在我的结论是,对于AP2,spoj.com上的代码审查在某种程度上是任意的。

#define NUM_MEMBERS 2000000LL
#define DISTANCE 3LL
#define START 1000000LL

int main(int argc, char *argv[])
{
    clock_t begin, finish;
    double time1, time2;

    long long n = NUM_MEMBERS;
    long long d = DISTANCE;
    long long start = START;
    long long end = START+((NUM_MEMBERS-1)*DISTANCE);

    begin = clock();
    for(long long i = 0; i < n; i++)
        printf("%lld ", start+(i*d));
    finish = clock();
    time1 = (double)(finish-begin) / CLOCKS_PER_SEC;

    begin = clock();
    for(long long i = start; i <= end; i+=d)
        printf("%lld ", i);
    finish = clock();
    time2 = (double)(finish-begin) / CLOCKS_PER_SEC;

    printf("\ntime1: %g\ntime2: %g\n", time1, time2);

    return 0;
}

0 个答案:

没有答案