c ++ sleep(0)循环行为

时间:2015-04-23 22:33:27

标签: c++ linux time sleep

我的问题涉及睡眠循环(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循环的迭代次数)如下图所示。

Time to execute N sleep(0) operations

注1:如果我修改代码以使用该额外参数,我的执行时间(大致)与我不使用argv[2]的值时相同,因此运行时间似乎是依赖的事实上,在命令行中传递了额外的参数,而不是关于该额外参数是否有用。

注2:如果我在命令行中传递第三个(以及第四个和第五个)参数,则执行时间与将两个参数传递给函数时的执行时间相同。

这种行为有什么解释?为什么两种情况下执行时间都不同?为什么第二种情况的执行时间会在饱和之前增加?

1 个答案:

答案 0 :(得分:3)

if (argc > 2)
    N = atoi(argv[1]);

这意味着除非您提供两个或更多参数,否则将忽略第一个参数。它应该是:

if (argc > 1)
    N = atoi(argv[1]);