C++ sleep(0) 循环行为
c++ sleep(0) loop behaviour
我的问题涉及睡眠(0) 操作循环的运行宁时间和作为参数传递的参数数量。考虑以下片段:
#include <iostream>
#include <cstdlib>
#include <unistd.h>
int main(int argc, char ** argv)
{
int i;
int N = 10000000000;
if(argc > 2)
N = std::atoi(argv[1]);
clock_t startTime = clock();
for(i=0;i<N;i++)
sleep(0);
double res = double( clock() - startTime ) / (double)CLOCKS_PER_SEC;
std::cout << res << std::flush;
return 0;
}
用c++
编译后,当我运行这个
./a.out
或这个(用任何整数代替 N)
./a.out N
我始终获得 5e-6 和 9e-6 之间的执行时间,与作为参数输入的迭代次数无关
当我添加第二个(未使用的)参数时
./a.out N 0
我得到的执行时间大约是 7e-6 最多 1000 次迭代。对于 1e10 次迭代,时间然后线性增加到 ~36。之后,运行宁时间停滞不前。
第二种情况相对于N(for循环的迭代次数)的执行时间如下图所示。
注意 1:如果我修改代码以使用该额外参数,我的执行时间与不使用 argv[2]
的值时(大致)相同,因此 运行 时间似乎取决于在命令行中传递了额外参数这一事实,而不取决于该额外参数是否有用。
注意 2:如果我在命令行中传递第三个(和第四个和第五个)参数,执行时间与我向函数传递两个参数时的执行时间相同。
如何解释这种行为?为什么两种情况下的执行时间不同?为什么第二种情况的执行时间在饱和前增加?
if (argc > 2)
N = atoi(argv[1]);
这意味着第一个参数将被忽略,除非您提供两个或更多参数。应该是:
if (argc > 1)
N = atoi(argv[1]);
我的问题涉及睡眠(0) 操作循环的运行宁时间和作为参数传递的参数数量。考虑以下片段:
#include <iostream>
#include <cstdlib>
#include <unistd.h>
int main(int argc, char ** argv)
{
int i;
int N = 10000000000;
if(argc > 2)
N = std::atoi(argv[1]);
clock_t startTime = clock();
for(i=0;i<N;i++)
sleep(0);
double res = double( clock() - startTime ) / (double)CLOCKS_PER_SEC;
std::cout << res << std::flush;
return 0;
}
用c++
编译后,当我运行这个
./a.out
或这个(用任何整数代替 N)
./a.out N
我始终获得 5e-6 和 9e-6 之间的执行时间,与作为参数输入的迭代次数无关
当我添加第二个(未使用的)参数时
./a.out N 0
我得到的执行时间大约是 7e-6 最多 1000 次迭代。对于 1e10 次迭代,时间然后线性增加到 ~36。之后,运行宁时间停滞不前。
第二种情况相对于N(for循环的迭代次数)的执行时间如下图所示。
注意 1:如果我修改代码以使用该额外参数,我的执行时间与不使用 argv[2]
的值时(大致)相同,因此 运行 时间似乎取决于在命令行中传递了额外参数这一事实,而不取决于该额外参数是否有用。
注意 2:如果我在命令行中传递第三个(和第四个和第五个)参数,执行时间与我向函数传递两个参数时的执行时间相同。
如何解释这种行为?为什么两种情况下的执行时间不同?为什么第二种情况的执行时间在饱和前增加?
if (argc > 2)
N = atoi(argv[1]);
这意味着第一个参数将被忽略,除非您提供两个或更多参数。应该是:
if (argc > 1)
N = atoi(argv[1]);