计算嵌套循环的执行时间

时间:2019-02-05 04:07:53

标签: c

假设我有一个嵌套的for循环和if-checks,如下所示,如果我想查看一个特定的for-loop或if-check要完成执行需要多少个时钟周期(大约几秒)。

内部for循环和if-check所花费的时钟周期数(秒)之和应等于(或近似等于)最外部for循环所花费的时钟周期数(秒)之和。 ?

还是我做错了?如果还有其他方法,我该如何计时循环??

注意:我有3个不同的功能几乎可以完成相同的事情,我已经声明了3个不同的功能来分别测量每个for循环或if-check,因为如果我尝试获取所有子组件的执行时间,相同的代码,则外部for循环占用的时钟周期数(秒)将包括一些额外的指令执行,这些指令正在计算内部for循环的时钟周期计数和if-check。

void fun1(){
       int i=0,j=0,k=0;
    clock_t t=0,t_start=0,t_end=0;
    //time the outermost forloop
    t_start = clock();
    for(i=0;i<100000;i++){
            for(j=0;j<1000;j++){
                    //some code
                    }
            if(k==0){
              //some code
                 }
            }
    t_end = clock();
    t=t_end-t_start;
    double time_taken = ((double)t)/CLOCKS_PER_SEC;
    printf("outer for-loop took %f seconds to execute \n", time_taken);
 }

void fun2(){
    int i=0,j=0,k=0;
    clock_t t2=0,t2_start=0,t2_end=0;
    for(i=0;i<100000;i++){
            //time the inner for loop
            t2_start=clock();
            for(j=0;j<1000;j++){
                    //some code
                    }
            t2_end=clock();
            t2+=(t2_end-t2_start);

            if(k==0){
                 //some code
                     }
            }
    double time_taken = ((double)t2)/CLOCKS_PER_SEC;
    printf("inner for-loop took %f seconds to execute \n", time_taken);
  }

 void fun3(){
    int i=0,j=0,k=0;
    clock_t t3=0,t3_start=0,t3_end=0;
    for(i=0;i<100000;i++){
            for(j=0;j<1000;j++){
                 //some code
                       }
            //time the if check
            t3_start=clock();
            if(k==0){
                    //some code
                    }
            t3_end=clock();
            t3+=(t3_end-t3_start);
            }
    double time_taken = ((double)t3)/CLOCKS_PER_SEC;
    printf("if-check took %f seconds to execute \n", time_taken);
  }

1 个答案:

答案 0 :(得分:0)

预期的答案是t中的fun1,可能比t2+t3fun2中的fun3略小代表评估外部循环本身的额外时间。

然而,度量本身所花费的时间却很少,这将是每次度量一次调用clock()本身的时间。在测量内部循环时,由于外部循环的迭代,有效地乘以100,000。

这是一个用于测量测量本身的程序,并且对于良好的测量而言,它还测量评估空的外部循环的时间。

#include <time.h>
#include <stdio.h>

int main () {
    clock_t t = 0;
    clock_t t_start, t_end;

    for (int i = 0; i < 100000; i++) {
        t_start = clock();
        t_end = clock();
        t += (t_end - t_start);
    }
    double time_taken = ((double) t) / CLOCKS_PER_SEC;
    printf ("Time imposed by measurement itself: %fsec\n", time_taken);


    t_start = clock();
    for (int i = 0; i < 100000; i++) {
    }
    t_end = clock();
    t = (t_end - t_start);
    time_taken = ((double) t) / CLOCKS_PER_SEC;
    printf ("Time to evaluate the loop: %fsec\n", time_taken);
}

至少在我的系统上,这表明测量值可能会使结果有些偏差:

Time imposed by measurement itself: 0.056949sec
Time to evaluate the loop: 0.000200sec

要获取您的内循环“真正”花费的时间,您需要减去通过测量它所增加的时间。