Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2022, 19:34   #1
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,537
По умолчанию Мы компилировали, компилировали ..

Решил сравнить свои волшебные компиляторы и ИДЕ.
Проверить быстродействие. В Си я не очень, поэтому код корявый.
Сортировка массива действ. чисел пузырьком.
На Си :
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NN 100000       
//      ^ NN меняю 
const double DRAND_MAX = 1.0*RAND_MAX;

int SetRnd()
{
  srand(time(NULL));
  return 0;
}

double DoubleRand()
{
	return rand()/(DRAND_MAX+1.0);
}
void bubbleSort(double *num, int size)
{
   int i,j;
   double temp;
    for (i = 0; i < size - 1; i++)
    for (j = (size - 1); j > i; j--)
    {
      if (num[j - 1] > num[j])
      {
        temp = num[j - 1];
        num[j - 1] = num[j];
        num[j] = temp;
      }
    }
  }

int main(int argc, char **argv)
{
   double a[NN];
   int i;
   clock_t start, end;
   SetRnd();
   for (i = 0; i < NN; i++)
    a[i] = DoubleRand();
   start = clock();
   bubbleSort(a, NN);
   end = clock();
   printf("%f\n",(double)(end - start) / (CLOCKS_PER_SEC));
   getchar();
   return 0;
}
На Pascal:
Код:
program perfBu;

uses crt,sysutils, DateUtils;
type
 arDouble = array of Double;
 
procedure Bubble(var x:arDouble);
var  t:Double;
     i,j,N:LongInt;
begin
 N:=Length(x);
 if N=1 then Exit;
 for i:=0 to N-2 do
  for j:=0 to N-i-2 do
   if x[j]>x[j+1] then
    begin
     t:=x[j+1];
     x[j+1]:=x[j];
     x[j]:=t;
    end;
end;
function CreateRandomRealArr(n:LongInt):arDouble;
var i:LongInt;
begin
 SetLength(CreateRandomRealArr,n);
 for i:=0 to n-1 do
  CreateRandomRealArr[i]:=Random;
end;

//==== 
var ar:arDouble;
  n:LongInt;
  t0:TDateTime;
BEGIN
 Randomize; 	
 n:=100000;  // меняется
 ar:=CreateRandomRealArr(n);
 t0:=Now;
 Bubble(ar);
 WriteLn((Now-t0)*86400);
 ReadLn;
END.
На Дельфы делал оконное, поэтому без WriteLn, выводил в Memo
Результат в секундах, и нижняя строка - размер .exe файла.
PS Размер - в байтах конечно, не в килобайтах, там на рисунке "kB" - это я ошибся.
Изображения
Тип файла: png perfPr.PNG (9.6 Кб, 47 просмотров)

Последний раз редактировалось type_Oleg; 27.11.2022 в 19:40.
type_Oleg вне форума Ответить с цитированием
Старый 27.11.2022, 19:39   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,389
По умолчанию

Для сортировки пузырьком важен набор данных, поэтому для тестирования лучше сделать отдельный генератор наборов и загрузку их из файлов. Тогда время сортировки можно будет оценивать.

Пока время это несвязанные величины, которые не отображают эффективность кода.
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 19:47   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,537
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Для сортировки пузырьком важен набор данных ...
Я запускал по нескольку раз и считал среднее. Времена не сильно отличались.
Пузырьки они разные бывают, бывают с проверкой, чтобы лишний раз не проходить. Этот - самый простой , всегда одно и то же количество циклов.
Хотя может быть будет зависеть от того, как часто выполняется if. Надо попробовать со всякими массивами.
type_Oleg вне форума Ответить с цитированием
Старый 27.11.2022, 21:14   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,537
По умолчанию

Вот, попробовал с 2-мя массивами.
Упорядоченный уже по возрастанию - самый легкий случай.
И упорядоченный по убыванию - вроде должен быть самым трудным, но оказалось не для всех. Для некоторых самый трудный - заполненный случайными числами ( см. 1-й пост).
Изображения
Тип файла: png perf2.PNG (18.5 Кб, 44 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 08.12.2022, 12:48   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,537
По умолчанию

Еще. Вот такой код. И результат на Geany и Code::Blocks . Разный результат для s3, хотя у обоих MinGW - GCC. Для s6 - у обоих аварийный выход.
Код:
#include <stdio.h>

int main(int argc, char **argv)
{   FILE *file = NULL; 
	int re;
	char s1[] = "123";

	char s2[3] ="123";

	char s3[] ={'1','2','3'};

	char s4[3] ={'1','2','3'};

	char *s5 = "123";

	char *s6 = {'1','2','3'};
	file = fopen("puts6.txt", "wb"); 
    if (file == NULL) 
    {   printf("Error");
        getchar();
        re = 100;   }
    re = fputs(s6,file);  // это меняю s1,s2 ...
    fclose(file);
    printf(" %d\n", re);
	return 0;
}
Что получилось -
Изображения
Тип файла: png fputs.png (32.5 Кб, 1 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 08.12.2022, 13:04   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 674
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Код:
char s2[3] ="123";
- а где завершающий 0?
Cuprum5 вне форума Ответить с цитированием
Старый 08.12.2022, 15:59   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,537
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- а где завершающий 0?
В смысле '\0' ?
Так это я пробовал, как без него компилятор будет работать. Там его нигде нет, не только s2
type_Oleg вне форума Ответить с цитированием