powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Линейный и бинарный поиски. Ликбез
3 сообщений из 3, страница 1 из 1
Линейный и бинарный поиски. Ликбез
    #36939681
guest1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал программку под gcc на простой с-шке:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h>

static int case_cnt, i, *cases, *one_case, *cases_end;
static long long int j, attempts_cnt;
static clock_t tm_beg, tm_now= 0 ;
static time_t tm_all_beg, tm_all_now;

#define ice_system_bsearch(key, base, cnt, f_cmp) \
  ({ \
    register int _cmp_res, i_res, i_beg, i_end; \
    register typeof(base) p_res; \
    \
    i_beg= 0 ; \
    i_end=(cnt- 1 ); \
    while (i_end>=i_beg) \
    { \
      i_res=(i_end+i_beg)>> 1 ; \
      if ((_cmp_res=f_cmp((key), (base+i_res)))> 0 ) \
        i_beg=i_res+ 1 ; \
      else if (_cmp_res< 0 ) \
        i_end=i_res- 1 ; \
      else \
        break; \
    } \
    if (i_end>=i_beg) \
      p_res=base+i_res; \
    else \
      p_res=NULL; \
    p_res; \
  })


static inline int cmp(const void *p1, const void *p2)
{
  return (*((int *)p1)-*((int *)p2));
}

static void binary()
{
  for(j= 0 ;j<attempts_cnt;j++)
  {
    i=rand() % case_cnt;
    if (bsearch(&i, cases, case_cnt, sizeof(int), cmp)==NULL)
    {
      fprintf(stderr, "binary: error in searching\n");
      return;
    }
  }
}

static void binary_via_macros()
{
  for(j= 0 ;j<attempts_cnt;j++)
  {
    i=rand() % case_cnt;
    if (ice_system_bsearch(&i, cases, case_cnt, cmp)==NULL)
    {
      fprintf(stderr, "binary: error in searching\n");
      return;
    }
  }
}

static void linear()
{
  for(j= 0 ;j<attempts_cnt;j++)
  {
    i=rand() % case_cnt;
    for(one_case=cases;one_case<cases_end;one_case++)
      if (*one_case==i)
        goto cont;
    fprintf(stderr, "linear: error in searching\n");
    return;
  cont:;
  }
}

static inline int GetTimeNow()
{
  static struct tms buffer;
  //
  if (times(&buffer)==((clock_t) - 1 ))
  {
    perror("GetTimeNow");
    return  1 ;
  }
  else
  {
    tm_now=buffer.tms_utime;
    if ((tm_all_now=time(NULL))==((time_t)- 1 ))
    {
      perror("GetTimeNow");
      return  1 ;
    }
    return  0 ;
  }
}

static inline int GetTimeStat()
{
  if (GetTimeNow())
    return  1 ;
  fprintf(stderr, "Job proceeded %lf seconds\n", (tm_now-tm_beg)/(double) sysconf(_SC_CLK_TCK));
  fprintf(stderr, "%d seconds spended in system environment at all\n", (int)(tm_all_now-tm_all_beg));
  return  0 ;
}

int main(int argc, char **argv)
{
  case_cnt=atoi(argv[ 1 ]);
  attempts_cnt=strtoll(argv[ 2 ], NULL,  10 );
  if ((cases=malloc(case_cnt*sizeof(int)))==NULL)
  {
    fprintf(stderr, "No memory\n");
    return  1 ;
  }
  for (i= 0 ;i<case_cnt;i++)
    cases[i]=i;
  cases_end=cases+case_cnt;
  //
  tm_all_beg=time(NULL);
  {
    struct tms buffer;
    //
    if (times(&buffer)==((clock_t) - 1 ))
    {
      perror("main: cannot find time: ");
      return  1 ;
    }
    else
      tm_beg=buffer.tms_utime;
  }
  //
  fprintf(stderr, "Binary search is about to start...\n");
  binary();
  GetTimeStat();
  fprintf(stderr, "Binary (via macros) search is about to start...\n");
  binary_via_macros();
  GetTimeStat();
  fprintf(stderr, "Linear search is about to start...\n");
  linear();
  GetTimeStat();
  return  0 ;
}

1) Результаты после простой компиляции "gcc bsearch_test.c"
shell$ ./a.exe 400 15000000
Binary search is about to start...
Job proceeded 2.406000 seconds
2 seconds spended in system environment at all
Binary (via macros) search is about to start...
Job proceeded 5.094000 seconds
5 seconds spended in system environment at all
Linear search is about to start...
Job proceeded 22.891000 seconds
23 seconds spended in system environment at all
Ничего удивительного, в макросе cmp таки не синлайнилась, хотя ее в
этом попросили. Поэтому (да и потому, что библиотечный вызов УЖЕ откомпилирован)
мы получаем Binary (via macros) медленнее,чем Binary в (5.094000-2.406000)/2.406000 раз.
Линейный, ясно, в разы медленнее.

2) Результаты после оптимизированной компиляции "gcc -O3 bsearch_test.c"
shell
$ ./a.exe 400 15000000
Binary search is about to start...
Job proceeded 2.235000 seconds
3 seconds spended in system environment at all
Binary (via macros) search is about to start...
Job proceeded 3.594000 seconds
4 seconds spended in system environment at all
Linear search is about to start...
Job proceeded 7.328000 seconds
8 seconds spended in system environment at all


Это шок... С каких пор линейный поиск "легким движением руки" превратился в бинарный???Я не знаю ни инструкций процессора ни опций компилятора, что ведут к такому эффекту...
...
Рейтинг: 0 / 0
Линейный и бинарный поиски. Ликбез
    #36945240
fleandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может он разложил это на несколько процессоров? линейный хорошо параллелится. Сделайте побольше данных
...
Рейтинг: 0 / 0
Линейный и бинарный поиски. Ликбез
    #36948507
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest1980Это шок... С каких пор линейный поиск "легким движением руки" превратился в бинарный???Я не знаю ни инструкций процессора ни опций компилятора, что ведут к такому эффекту...
Как мне кажется, тесты построены немного некорректно.
Чтобы сравнивать скорость поиска - во всех случаях нужно искать один и тот же набор чисел, в данном же случае "обстоятельства могут сложится удачно".
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Линейный и бинарный поиски. Ликбез
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]