为什么第一个循环比第二个循环快?
对我来说,第二个循环似乎更便宜,因为身体中没有数学表达式来计算。但是对于第二个循环,我仍然在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;
}