free pascal vs Delphi 10.3

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: free pascal vs Delphi 10.3

Сообщение Alex2013 » 05.06.2020 06:36:16

Странный спор ...
Код: Выделить всё
a:array of char = ['a','b','c','d'];  ?

А почему не через строку ?
a:String = 'abcd';
Обращение точно такое же .
Да возможно для дельфи подобный прикол можно проделать и с числами.
Но в чем смысл записи константы в динамический масив ?

Неужели трудно объявить что-то вроде этого ?
Код: Выделить всё
a:array [0..4] of char = ('a','b','c','d'); b:array of char;
...
SetLength(b,SizeOf(a)); b:=a;

И вообще динамический масив это дикая гадость при использование иначе чем для однократного резервирования при запуске программы .
Хотите гарантированную чистку мусора ? Объявляйте локальные переменные . Строки кстати пресловутую "сборку мусора" имеют и если сильно лень отслеживать освобождение памяти то парочка простейших процедур преобразует строки в масив практически любого типа и даже в "резиновый" масив записей переменной длинны.

Но вообще даже "100%-ная автоматическая чистка" не может гарантировать от приколов вроде знаменитого "бича хайасма" под названием "кольцевание" ( то есть "неявной рекурсии" ). :idea:
Alex2013
долгожитель
 
Сообщения: 1780
Зарегистрирован: 03.04.2013 11:59:44

Re: free pascal vs Delphi 10.3

Сообщение Снег Север » 05.06.2020 07:25:55

Alex2013 писал(а):И вообще динамический масив это дикая гадость при использование иначе чем для однократного резервирования при запуске программы .

А вас очень удивлю :D , но динамический массив - это первооснова всех списков и прочих неотъемлемых свойств современного паскаля.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2547
Зарегистрирован: 27.11.2007 16:14:47

Re: free pascal vs Delphi 10.3

Сообщение iskander » 05.06.2020 08:58:18

Alex2013 писал(а):Странный спор ...

Действительно, странно видеть, что фичи, помогающие писать более понятный, лаконичный и легко сопровождаемый код, вызывают активное неприятие.
Alex2013 писал(а):А почему не через строку ?

Ну, наверное, потому, что нужен array of char, а не строка.
Alex2013 писал(а):Неужели трудно объявить что-то вроде этого ?
Код: Выделить всё
a:array [0..4] of char = ('a','b','c','d');
b:array of char;
...
SetLength(b,SizeOf(a));
b:=a;


Итого четыре строки вместо одной и код помаленьку превращается в простыню, которая еще и не компилируется.
iskander
постоялец
 
Сообщения: 286
Зарегистрирован: 08.01.2012 18:43:34

Re: free pascal vs Delphi 10.3

Сообщение Alex2013 » 05.06.2020 12:20:02

Снег Север писал(а):А вас очень удивлю , но динамический массив - это первооснова всех списков и прочих неотъемлемых свойств современного паскаля.

В списках память выделятся явно через GetMem, MemAlloc, ReallocMem и тому подобные процедуры и функции .
(Сильно сомневаюсь что иначе была бы настолько заметная разница в скорости добавления новых элементов )
Зы
Упс у TList есть упор и он чуток раньше чем я думал !
MaxListSize = Maxint div 16; ( 134 217 727)
(Разумеется это куда лучше, чем чуть больше чем 16 тысяч для ТурбоВижен но като все равно неуютно )
Последний раз редактировалось Alex2013 05.06.2020 12:50:52, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 1780
Зарегистрирован: 03.04.2013 11:59:44

Re: free pascal vs Delphi 10.3

Сообщение Seenkao » 05.06.2020 12:45:15

Снег Север писал(а):А вас очень удивлю , но динамический массив - это первооснова всех списков и прочих неотъемлемых свойств современного паскаля.

Списков, возможно. Но уж явно не первооснова всего остального. Нафиг динамические массивы не нужны, кроме как захламления памяти, если не умеешь пользоваться массивами.
Seenkao
новенький
 
Сообщения: 36
Зарегистрирован: 01.04.2020 03:37:12

Re: free pascal vs Delphi 10.3

Сообщение Alex2013 » 05.06.2020 12:52:26

Seenkao писал(а):Списков, возможно

Невозможно ! Только что смотрел . :idea:

Но главное в том что даже идеальная автоматическая "уборка мусора" не может на 100% гарантировать от утечек памяти и "прочих опасностей" кривого кода.
Последний раз редактировалось Alex2013 05.06.2020 12:58:08, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 1780
Зарегистрирован: 03.04.2013 11:59:44

Re: free pascal vs Delphi 10.3

Сообщение Seenkao » 05.06.2020 12:57:35

Alex2013, что в принципе и правильно. :)
Seenkao
новенький
 
Сообщения: 36
Зарегистрирован: 01.04.2020 03:37:12

Re: free pascal vs Delphi 10.3

Сообщение iskander » 05.06.2020 13:03:55

Alex2013 писал(а):Невозможно ! Только что смотрел

Тогда я удивлю вас еще больше.
Самая шустрая из известных мне паскалевских контейнерных библиотек(LGenerics) построена на динамических массивах чуть более чем полностью.
iskander
постоялец
 
Сообщения: 286
Зарегистрирован: 08.01.2012 18:43:34

Re: free pascal vs Delphi 10.3

Сообщение Alex2013 » 05.06.2020 13:14:10

Отсюда вывод "а не слишком ли много я много чая пью" ... :wink: (Смысле что по моему не стоит носится со сборкой мусора как с некой "волшебной панацей" )
То есть все равно нужны обработки исключений, контроль пустых указателей и запрет на повторный вызов (то бишь вызов процедур и функций обработки данных до окончания их работы, что в современных многоядерных процесорах и многопоточных ос особенно актуально )
И вообще неужели настолько сложно проверить лимит доступной памяти ДО ее выделения ?? :roll:

Добавлено спустя 26 минут 29 секунд:
iskander писал(а):
Alex2013 писал(а):Невозможно ! Только что смотрел

Тогда я удивлю вас еще больше.
Самая шустрая из известных мне паскалевских контейнерных библиотек(LGenerics) построена на динамических массивах чуть более чем полностью.

LGenerics извиняюсь за тавтологию построена на Дженериках. А это НЕ динамический массив (я питаю слабую надежду что в дженериках все-же что-то со скоростью изменения размера массива сделали ) к тому-же если этот код ...
Код: Выделить всё
procedure TGBaseSortedList.Expand(aValue: SizeInt);
begin
  //there aValue > Capacity
  if aValue <= DEFAULT_CONTAINER_CAPACITY then
    System.SetLength(FItems, DEFAULT_CONTAINER_CAPACITY)
  else
    if aValue <= MAX_CONTAINER_SIZE div SizeOf(T) then
      begin
        aValue := Math.Min(MAX_CONTAINER_SIZE div SizeOf(T), LGUtils.RoundUpTwoPower(aValue));
        System.SetLength(FItems, aValue);
      end
    else
      CapacityExceedError(aValue);
end;
procedure TGBaseSortedList.ItemAdding;
begin
  if ElemCount = System.Length(FItems) then
    Expand(Succ(ElemCount));
end;
procedure TGBaseSortedList.InsertItem(aIndex: SizeInt; constref aValue: T);
begin
  ItemAdding;
  if aIndex < ElemCount then
    begin
      System.Move(FItems[aIndex], FItems[Succ(aIndex)], SizeOf(T) * (ElemCount - aIndex));
      if IsManagedType(T) then
        System.FillChar(FItems[aIndex], SizeOf(T), 0);
    end;
  FItems[aIndex] := aValue;
  Inc(FCount);
end;
...заметно БЫСТРЕЕ стандартного ТList то я прямо уж не знаю кого вызвать ...
Может быть охотников за привидениями ? :wink:
Последний раз редактировалось Alex2013 05.06.2020 19:42:05, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 1780
Зарегистрирован: 03.04.2013 11:59:44

Re: free pascal vs Delphi 10.3

Сообщение Дож » 05.06.2020 14:40:43

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

Никто не спорит с тем, что они нужны. Спорят с тем, что их обязательно нужно писать вручную, хотя многое очевидным образом может быть автоматизировано. И даже уже автоматизировано для некоторых типов: например, для локального AnsiString, динамического массива или интерфейса со счётчиком ссылок будет сгенерирован неявный try-finally блок.

Освободившееся от написания рутинного и однообразного кода внимание и время программиста может быть потрачено на что-то более полезное.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 849
Зарегистрирован: 12.10.2008 16:14:47

Re: free pascal vs Delphi 10.3

Сообщение Mirage » 05.06.2020 15:09:28

RAII, в принципе, лучше сборки мусора, т.к. оная работает только для памяти, а RAII для любого типа ресурсов.
Товарищи, отрицающие полезность подобных техник и топящие за явное написание всего и вся (что уже давно не так), едва ли работали в команде и/или над серьезными проектами.
Другое дело, что блок со своими переменными и финализациями посреди процедуры редко когда нужен и вообще выглядит странно. Почему бы не оформить его в процедуру? И проблем с финализацией не будет. Я давно использую автофинализацию с интерфейсными ссылками и try/finally мне нужен редко.
Mirage
энтузиаст
 
Сообщения: 875
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: free pascal vs Delphi 10.3

Сообщение iskander » 05.06.2020 15:33:17

Alex2013 писал(а):LGenerics извиняюсь за тавтологию построена на Дженериках.

Я потрясен глубиной умозаключения.
Alex2013 писал(а):к тому-же если этот код ... заметно БЫСТРЕЕ стандартного ТList то я прямо уж не знаю кого вызвать ...
Может быть охотников за привидениями ?

А давайте вызовем.
Мне неизвестно по какому наитию вы выбрали TGBaseSortedList - это сортированный список(всегда), будем лучше сравнивать сравнимое: TList и TGVector<Pointer>:
Код: Выделить всё
program test;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, LGUtils, LGVector, DateUtils;

procedure TestTList;
var
  List: TList;
  I, J: Integer;
begin
  List := TList.Create;
  try
    for I := 1 to 10 do
      begin
        for J := 1 to 10000000 do
          List.Add(nil);
        List.Clear;
      end;
  finally
    List.Free;
  end;
end;

procedure TestGVector;
type
  TList = specialize TGVector<Pointer>;
var
  List: specialize TGAutoRef<TList>;
  I, J: Integer;
begin
  with List.Instance do
    for I := 1 to 10 do
      begin
        for J := 1 to 10000000 do
          Add(nil);
        Clear;
      end;
end;

var
  Start: TTime;

begin
  Start := Time;
  TestTList;
  WriteLn('TList time:    ', MillisecondsBetween(Time, Start));

  Start := Time;
  TestGVector;
  WriteLn('TGVector time: ', MillisecondsBetween(Time, Start));
end.

выхлоп:
Код: Выделить всё
TList time:    1504
TGVector time: 794   
iskander
постоялец
 
Сообщения: 286
Зарегистрирован: 08.01.2012 18:43:34

Re: free pascal vs Delphi 10.3

Сообщение Awkward » 05.06.2020 16:25:41

iskander, а Вы проверяли, какие начальные размеры и значение для увеличения размера массивов в обоих классах? Возможно, дело не в алгоритме увеличения размера, а всего лишь в величинах этого самогоувеличения?
Awkward
новенький
 
Сообщения: 29
Зарегистрирован: 19.01.2017 00:06:47

Re: free pascal vs Delphi 10.3

Сообщение iskander » 05.06.2020 16:49:15

Чудес не бывает и дело, конечно же, в алгоритме увеличения размера, подробности можно посмотреть в исходниках.
iskander
постоялец
 
Сообщения: 286
Зарегистрирован: 08.01.2012 18:43:34

Re: free pascal vs Delphi 10.3

Сообщение Alex2013 » 05.06.2020 19:53:19

iskander писал(а):TList time:    1504
TGVector time: 794 


Add(nil); Не много не то (На nil есть специальная заглушка ) .... :idea: Надо поверить ...
iskander писал(а):Я потрясен глубиной умозаключения.

Ну извините с дженериками я почти не сталкивался ... поэтому посмотрел в код и увидел объявление
Код: Выделить всё
generic TGBaseSortedList<T, TCmpRel> = class(specialize TGAbstractCollection<T>)
.
О чем и написал.
Alex2013
долгожитель
 
Сообщения: 1780
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 5

Рейтинг@Mail.ru