相同的C程序,但执行时间不同
我写了一个C程序来找出给定参数中的素数。但是对于相同的输入和输出,程序有不同的执行时间相同的C程序,但执行时间不同,c,C,我写了一个C程序来找出给定参数中的素数。但是对于相同的输入和输出,程序有不同的执行时间 #include <stdio.h> int main(int argc, char const *argv[]) { int n,p,k; scanf("%d", &n); int prime[n+1]; for (p = 2; p <= n; ++p) { if (prime[p]!=-1)
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n,p,k;
scanf("%d", &n);
int prime[n+1];
for (p = 2; p <= n; ++p)
{
if (prime[p]!=-1)
{
for (int i = p*2,k=2; i < n; k++,i=k*p)
{
prime[i]=-1;
}
}
}
for (int i = 1; i < n ; ++i)
{
if (prime[i]!=-1)
{
printf("%d ",i );
}
}
return 0;
}
#包括
int main(int argc,char const*argv[]
{
int n,p,k;
scanf(“%d”和“&n”);
整数素数[n+1];
对于(p=2;p您测量的是用户键入输入所需的时间,即200
在任何现代计算机上,输入后计算结果不会花费2到5秒
的确,“计算机可能正在做其他事情”,因此执行时间会有所不同,但这样的代码不会增加3秒
为了使测量更可靠,您需要“删除”用户输入,即删除scanf
您应该将n
的值作为命令行参数,而不是scanf
像这样使用代码
// scanf("%d", &n); Dont use scanf but use lines like the two below.
if (argc < 2) exit(1); // user error - no number given
n = atoi(argv[1]); // convert command line arg to integer
现在测得的时间将比2-5秒小得多,并且您不会看到执行时间有如此大的变化
注意:虽然atoi
易于使用,但通常最好使用strtol
程序在环境中的执行不仅取决于代码,还取决于其他一些环境变量,如CPU负载
CLOCKS_PER_SEC是一个常量,在中声明。要获取C应用程序中任务使用的CPU时间,请使用:
clock_t begin = clock();
/* Do the work. */
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
对于您的程序,您可能可以检查
输入时占用的CPU时间
生成素数需要CPU时间
……等等
时间取决于您的CPU负载。有关详细信息,请访问您的电脑上程序的执行不仅取决于代码,还取决于其他一些环境变量,如CPU负载,这可能会导致第二次执行的延迟。检查您机器的整体状态。两次执行是否相同?而不是scanf(“%d”,&n);
don=200
。然后运行它两次。同时删除printf,因为它的执行时间可能会明显不同。您正在测量挂钟时间。在这段时间内,您的计算机做了(或没有做)除了运行你的程序之外,还有很多事情:它从互联网下载了一个病毒,它重新粉刷了你的窗口,它移动了几个磁盘块以提高性能,……你应该测量处理时间。也许你在较慢的尝试中输入200不够快。(见上面P_J_的评论).除了已经提到的所有技术因素(CPU节流、总工作负载等),人为因素也是你所看到的一个非常合理的原因。
clock_t begin = clock();
/* Do the work. */
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
#include <stdio.h>
#include<time.h>
int main(int argc, char const *argv[])
{
int n,p,k;
clock_t t , t1, t2;
t = clock();
scanf("%d", &n);
t = clock() - t;
double time_taken = ((double)t)/CLOCKS_PER_SEC; // in seconds
printf("Took %f seconds to take the input\n", time_taken);
t2 = clock();
int prime[n+1];
for (p = 2; p <= n; ++p)
{
if (prime[p]!=-1)
{
for (int i = p*2,k=2; i < n; k++,i=k*p)
{
prime[i]=-1;
}
}
}
t2 = clock() - t2;
double time_taken2 = ((double)t2)/CLOCKS_PER_SEC; // in seconds
printf("Took %f seconds for generating the prime number \n", time_taken2);
for (int i = 1; i < n ; ++i)
{
if (prime[i]!=-1)
{
printf("%d ",i );
}
}
return 0;
}
200
Took 0.000075 seconds to take the input
Took 0.000004 seconds for generating the prime number
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 1
13 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199