第二种情况应该更有效,因为不需要为循环中的每次迭代计算循环限制器,这是有道理的。尝试使用下面给出的代码测量通过 2 种类型的 for 循环所使用的 CPU 时间。对于较小的数字(例如 n = 25),对于第一种情况,看起来 cpu 时间实际上更短。但是对于 n>=100 的值,第二种情况会提供更短的 cpu 时间。
clock_t start,end;
double cpu_time_used;
double n, root;
n = atoi(argv[1]);
printf("n= %0f \n",n);
start = clock();
for (int i=0; i*i<n; i++);
end = clock();
cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
printf("first iter: cpu_time_used: %f \n", cpu_time_used);
start = clock();
root = sqrt(n);
for (int i=0; i<=root; i++);
end = clock();
cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
printf("second iter: cpu_time_used: %f \n", cpu_time_used);
输出:
n= 25.000000
first iter: cpu_time_used: 0.000004
second iter: cpu_time_used: 0.000011
n= 100.000000
first iter: cpu_time_used: 0.000002
second iter: cpu_time_used: 0.000001
n= 1000000.000000
first iter: cpu_time_used: 0.000011
second iter: cpu_time_used: 0.000008