У меня есть две функции 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
И отношения между этими временами стабильны!Первое всегда будет больше второго, и обычно совсем немного.Что происходит?