相同的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)

我写了一个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)
        {
            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);
    do
    n=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