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]);