Почему эти две идентичные функции имеют разное время выполнения? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть две функции C, которые являются копиями друг друга.В приведенном ниже коде я печатаю, сколько времени они занимают, чтобы выполнить.Первая функция (независимо от того, какая это копия) всегда выполняется дольше, чем вторая.Почему это так?

#include <stdio.h>
#include <time.h> // for clock_t

int binsearch_old (int x, int v[], int n);
int binsearch_new (int x, int v[], int n);

void main ()
{
  int x = 4;
  int v[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int n = 10;

  clock_t begin_old = clock();
  printf("\nbinsearch_old :: position: %i\n", binsearch_old(x, v, n));
  clock_t end_old = clock();
  double time_spent_old = (double)(end_old - begin_old) / CLOCKS_PER_SEC;
  printf("time spent old: %f\n", time_spent_old);

  clock_t begin_new = clock();
  printf("\nbinsearch_new :: position: %i\n", binsearch_new(x, v, n));
  clock_t end_new = clock();
  double time_spent_new = (double)(end_new - begin_new) / CLOCKS_PER_SEC;
  printf("time spent new: %f\n", time_spent_new);
}

int binsearch_old (int x, int v[], int n)
{

  int low, high, mid;
  low = 0;
  high = n - 1;
  while (low <= high) {
    mid = (low + high) / 2;
    if ( x < v[mid])
      high = mid - 1;
    else if (x > v[mid])
      low = mid + 1;
    else //found match
      return mid;
  }
  return -1; // no match
}

int binsearch_new (int x, int v[], int n)
{
  int low, high, mid;
  low = 0;
  high = n - 1;

  while (low <= high) {
    mid = (low + high) / 2;
    if (x < v[mid])
      high = mid - 1;
    else if (x > v[mid])
      low = mid + 1;
    else //found match
      return mid;
  }
  return -1; // no match
}

После gcc test.c и ./a.out вы увидите что-то вроде:

binsearch_old :: position: 3
time spent old: 0.000115

binsearch_new :: position: 3
time spent new: 0.000007

И отношения между этими временами стабильны!Первое всегда будет больше второго, и обычно совсем немного.Что происходит?

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Вы также измеряете время печати. Вы не должны считать время исполнения printf.

  clock_t begin_old = clock();
  int val = binsearch_old(x, v, n);
  clock_t end_old = clock();
  printf("\nbinsearch_old :: position: %i\n", val);
  double time_spent_old = (double)(end_old - begin_old) / CLOCKS_PER_SEC;
  printf("time spent old: %f\n", time_spent_old);

Если вы не в счет, то спросите себя why does printf have different times for similar calls ?.

2 голосов
/ 12 июня 2019

«Разогрев» всей необходимой функциональности для реализации print не является незначительным.Просмотрите исходный код библиотеки времени выполнения C, чтобы убедиться в этом.Таким образом, первый вызов, который вы делаете printf, обычно будет медленнее, чем последующие вызовы.

Вызовы printf, которые вы делаете, находятся в пределах времени, что является ошибкой в ​​вашей реализации.

Удаление вызова printf из таймингов приведет к равенству результата.

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