我的问题涉及睡眠循环(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:如果我在命令行中传递第三个(以及第四个和第五个)参数,则执行时间与将两个参数传递给函数时的执行时间相同。
这种行为有什么解释?为什么两种情况下执行时间都不同?为什么第二种情况的执行时间会在饱和之前增加?
答案 0 :(得分:3)
if (argc > 2)
N = atoi(argv[1]);
这意味着除非您提供两个或更多参数,否则将忽略第一个参数。它应该是:
if (argc > 1)
N = atoi(argv[1]);