【问题标题】:Calculating the execution time of nested for loops计算嵌套for循环的执行时间
【发布时间】:2019-02-05 04:07:52
【问题描述】:

假设我有一个嵌套的 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);
  }

【问题讨论】:

  • 你做错了吗?这取决于你的目标是什么。在许多情况下,Big O(代码的时间复杂度)比原始速度更重要。
  • OT:为了便于阅读和理解;一致地缩进代码。在每个左大括号“{”后缩进。在每个右大括号 '}' 之前取消缩进。建议每个缩进级别为 4 个空格,(不是制表符)

标签: c


【解决方案1】:

预期的答案是fun1 中的t 可能略多于fun2 和fun3 中的t2+t3,表示评估外循环本身的额外时间.

然而,不太明显的是测量本身增加的时间,这将是每次测量调用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

要获得你的内部循环“真正”花费的时间,你需要减去测量它所增加的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多