在 for 循环中使用哪个更有效,i<sqrt(n) 或 i*i<(n)?
Which is more efficient to use in a for loop, i<sqrt(n) or i*i<(n)?
谁能帮我看看下面这两个哪个更有效更正确?
1.
for(int i = num; i * i <= n; i++)
2.
int root = sqrt(n);
for(int i = num; i <= root; i++)
在第一种方法中,我们在每次循环运行时计算 i 的平方。此外,我们无法预先计算 i 的平方,因为 i 每次都会更新。
在第二种方法中,我们不是每次都计算 sqrt(n)。这是节省时间吗?
即使对于大数字(如 10^6),第二个循环是否会更快地获得 100% 准确的结果?
第二种情况应该更有效是有道理的,因为不需要为循环中的每次迭代计算循环限制器。尝试使用下面给出的代码测量通过 2 种类型的 for 循环所用的 CPU 时间。
看起来 cpu 时间实际上对于第一种情况更小,对于较小的数字,如 n=25。但是对于 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
谁能帮我看看下面这两个哪个更有效更正确?
1.
for(int i = num; i * i <= n; i++)
2.
int root = sqrt(n);
for(int i = num; i <= root; i++)
在第一种方法中,我们在每次循环运行时计算 i 的平方。此外,我们无法预先计算 i 的平方,因为 i 每次都会更新。
在第二种方法中,我们不是每次都计算 sqrt(n)。这是节省时间吗?
即使对于大数字(如 10^6),第二个循环是否会更快地获得 100% 准确的结果?
第二种情况应该更有效是有道理的,因为不需要为循环中的每次迭代计算循环限制器。尝试使用下面给出的代码测量通过 2 种类型的 for 循环所用的 CPU 时间。 看起来 cpu 时间实际上对于第一种情况更小,对于较小的数字,如 n=25。但是对于 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