Расчет времени выполнения вложенных циклов - PullRequest
0 голосов
/ 05 февраля 2019

Предположим, у меня есть вложенный цикл for и проверки if, показанные ниже, если бы я хотел увидеть, сколько тактов (в конечном счете, сколько секунд) выполняет конкретный цикл for или if, чтобы завершить выполнение.

Если сумма количества тактов (секунд), взятых внутренним циклом for и if-check, равна (или приблизительно равна) количеству тактов (секунд), взятых самым внешним для-loop.?

Или я делаю это неправильно?Как рассчитать циклы, если есть какой-то другой способ сделать это ??1005*

Примечание: у меня есть 3 разные функции, выполняющие почти одно и то же, я объявил 3 разные функции для измерения каждого цикла for или если-check отдельно 'потому что, если я пытаюсь получить время выполнения всех подкомпонентов в одном и том же фрагменте кода, то количество тактов (сек), взятых внешним циклом for, будет включать в себя некоторое дополнительное выполнение команд, которыевычисление количества тактов внутреннего цикла for-if и 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 голосов
/ 05 февраля 2019

Ожидаемый ответ - t в fun1, вероятно, будет немного больше, чем t2+t3 из fun2 и 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

Чтобы получить количество времени, которое ваши внутренние петли "действительно" принимают,вам нужно вычесть то, что добавлено актом его измерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...