FPC VS DCC32

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

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

FPC VS DCC32

Сообщение StarikPro » 30.08.2014 12:36:41

Привет всем!

Накидал приложение:
Код: Выделить всё
nit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

const
     SIZE_TST_ARRAY = 1024*1024*10;
type
  TForm1 = class(TForm)
    btnBtnIntToStrTest: TButton;
    btnBtnForTest: TButton;
    btnBtnEmptyFillTest: TButton;
    lblResult: TLabel;
    lblForTst: TLabel;
    lblEmptyFill: TLabel;
    procedure BtnEmptyFillTestClick(Sender: TObject);
    procedure BtnForTestClick(Sender: TObject);
    procedure BtnIntToStrTestClick(Sender: TObject);
  private
    { Private declarations }
    mas: array[0..SIZE_TST_ARRAY - 1] of string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtnIntToStrTestClick(Sender: TObject);
var
   i: int32;
   ms: DWORD;
begin
  ms := GetTickCount;
  for i := 0 to SIZE_TST_ARRAY - 1 do
      mas[i] := IntToStr(i);
  lblResult.Caption := IntToStr(GetTickCount - ms);
end;

procedure TForm1.BtnForTestClick(Sender: TObject);
var
   i: int32;
   ms: DWORD;
begin
  ms := GetTickCount;
  for i := 0 to SIZE_TST_ARRAY - 1 do;
  lblForTst.Caption := IntToStr(GetTickCount - ms);
end;

procedure TForm1.BtnEmptyFillTestClick(Sender: TObject);
var
   i: int32;
   ms: DWORD;
begin
  ms := GetTickCount;
  for i := 0 to SIZE_TST_ARRAY - 1 do
      mas[i] := '';
  lblEmptyFill.Caption := IntToStr(GetTickCount - ms);
end;

end.


Запустил из под лазаря и делфи хе5.
Результат не в пользу первого что огорчает:
    а) заполнение массива строками с вызовом IntToStr(i):
    - delphi - 1139 мс;
    - lazarus - 1607 мс;
    б) холостой проход по циклу через for:
    - delphi - 63 мс;
    - lazarus - 63 мс;
    в) заполнение массива пустыми строками:
    - delphi - 374 мс;
    - lazarus - 624 мс;
У кого какие мысли по этому поводу?
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение Лекс Айрин » 30.08.2014 12:49:55

Вполне нормальная плата за кроссплатформенность и бесплатность. Да и выборка мала.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: FPC VS DCC32

Сообщение StarikPro » 30.08.2014 12:54:12

Ну если учесть что работа со строками (а как я понял проблема в них) занимает чаще всего львиную долю кода то можно сказать выборка вполне достаточная
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение hinst » 30.08.2014 13:02:11

StarikPro писал(а):У кого какие мысли по этому поводу?


мне чесно говоря срать: когда начнёт что-нибудь тормозить, тогда начну оптимизировать
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: FPC VS DCC32

Сообщение StarikPro » 30.08.2014 13:12:37

hinst писал(а):мне чесно говоря срать: когда начнёт что-нибудь тормозить, тогда начну оптимизировать

...да будет поздно
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение hinst » 30.08.2014 13:26:45

ну если пишешь херак-херак и сразу в релиз - то да
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: FPC VS DCC32

Сообщение Лекс Айрин » 30.08.2014 13:41:33

StarikPro писал(а):Ну если учесть что работа со строками (а как я понял проблема в них) занимает чаще всего львиную долю кода то можно сказать выборка вполне достаточная


1)лично у ВАС возможно, но не стоит обобщать.
2) а где уверенность, что: а) не тормозит создание/обход/инициализация массива? б) выбрано оптимальное представление? в) Процедура профилирования тоже может тормозить...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: FPC VS DCC32

Сообщение hovadur » 30.08.2014 14:01:47

StarikPro писал(а):Запустил из под лазаря и делфи хе5.

Я запустил на 32-битной машине из под 32-бит лазаря и 32-бит делфи хе2. Результаты:
а) заполнение массива строками с вызовом IntToStr(i):
- delphi - 2859 мс;
- lazarus - 2421 мс;
б) холостой проход по циклу через for:
- delphi - 16 мс;
- lazarus - 16 мс;
в) заполнение массива пустыми строками:
- delphi - 766 мс;
- lazarus - 62 мс;

Тоже самое, только на 64-бит машине из под 32-бит лазаря и 32-бит делфи хе2. Результаты:
а) заполнение массива строками с вызовом IntToStr(i):
- delphi - 639 мс;
- lazarus - 889 мс;
б) холостой проход по циклу через for:
- delphi - 31 мс;
- lazarus - 0 мс;
в) заполнение массива пустыми строками:
- delphi - 47 мс;
- lazarus - 47 мс;
Итог: на 32-бит машине lazarus быстрее на 20%, на 64-бит машине delphi быстрее на 40%.
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: FPC VS DCC32

Сообщение StarikPro » 30.08.2014 14:22:00

Лекс Айрин писал(а):1)лично у ВАС возможно, но не стоит обобщать.

у меня да, сплош и рядом стринги, стринглисты, структуры и классы содержащие строки, неповезло
Лекс Айрин писал(а):2) а где уверенность, что: а) не тормозит создание/обход/инициализация массива? б) выбрано оптимальное представление? в) Процедура профилирования тоже может тормозить...

- инициализация выполняется в момент создания формы;
- обход 63 мс как я уже указал в самом тесте;
- профелирование составляет исходя из предыдущей строки < 63 мс;
- выбрано оптимальное представление - не понял;
hovadur писал(а):Тоже самое, только на 64-бит машине из под 32-бит лазаря и 32-бит делфи хе2

Я при аналогичном варианте тестировал, проц Phenom 2 X4 2.8 GHz. Осталось посмотреть на 64-битной машине 64-бит лазаря и 64-бит делфи. Есть у кого возможность проверить?
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение SSerge » 30.08.2014 16:42:30

А кой хрен ЭТО тестировать (имеется в виду предложенный алгоритм)?
Вот если вы подложите FPC свинью в виде постоянно модифицируемых строк с преобразованием, сегментацией и переприсвоением то... можете убедиться, что на строковых операциях при определенных обстоятельствах он в десятки раз сольёт по производительности... Нет, не дельфи XE, а яве.

И, если уж сравнивать, то приводить данные к одному и тому же строковому типу, а то у вас в delphi XE string=UnicodeString, а в FPC string=AnsiString. И скорость работы с UnicodeString в тех версиях FPC, что ее поддерживают, вам еще более резко не понравится :D
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: FPC VS DCC32

Сообщение StarikPro » 30.08.2014 17:14:35

SSerge писал(а):А кой хрен ЭТО тестировать (имеется в виду предложенный алгоритм)?

лазарус + фпс толко начал рассматривать в качестве альтернативы Delphi и пока не в курсе о качестве их реализаций, поэтому и возник вопрос.
SSerge писал(а):...И, если уж сравнивать, то приводить данные к одному и тому же строковому типу, а то у вас в delphi XE string=UnicodeString, а в FPC string=AnsiString. И скорость работы с UnicodeString в тех версиях FPC, что ее поддерживают, вам еще более резко не понравится :D

Вы правы, ситуация с UnicodeString ещё хуже в разы. Очень жаль. Возможно причина в менеджере памяти. Сторонних для фпс не нашлось чтоб проверить.
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение alexs » 30.08.2014 21:41:58

Если у вас какие-то специфичные условия по работе со строками - то используйте заточенные на это алгоритмы и структуры памяти. Стринглисты в этом случае - зло.
А если обычные гуёвые морды для пользователей для автоматизации бизнес процессов - то разницу в скорости обработки строк вы не заметите. Будут более другие узкие места.
FPC+Lazarus предоставляют очень много всяких плюсов, чтобы можно было научиться обходить их слабые места.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FPC VS DCC32

Сообщение kazalex » 31.08.2014 00:23:40

Юникод-строки в данном тесте тормозят не из-за менеджера памяти (хотя и он в FPC не самый шустрый), а из-за отсутствия у FPC юникодной RTL. В настоящее время IntToStr возвращает AnsiString, которая по требованию будет преобразовываться в UnicodeString (а это три похода к менеджеру памяти, вместо одного в случае Delphi, да еще затраты на преобразование).
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: FPC VS DCC32

Сообщение StarikPro » 31.08.2014 10:07:18

alexs писал(а):Если у вас какие-то специфичные условия по работе со строками - то используйте заточенные на это алгоритмы и структуры памяти. Стринглисты...

Спасибо, я это прекрасно понимаю. Самое смешное что в С++ так было всегда и никто не жаловался, особо, а Delphi меня однако разбаловала и возникает естественное желание "чтоб было не хуже" и даже лучше :)

kazalex писал(а):Юникод-строки в данном тесте тормозят не из-за менеджера памяти (хотя и он в FPC не самый шустрый), а из-за отсутствия у FPC юникодной RTL. В настоящее время IntToStr возвращает AnsiString, которая по требованию будет преобразовываться в UnicodeString (а это три похода к менеджеру памяти, вместо одного в случае Delphi, да еще затраты на преобразование).

Да похоже и то и другое. А есть какой-нибудь роадмап по ФПС, в этом направлении планируется развитие ?
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: FPC VS DCC32

Сообщение kazalex » 31.08.2014 11:51:31

StarikPro
Вообще, роадмап есть, но он в таком состоянии, что его, как бы, нет :( А развитие, несомненно, планируется. Во всяком случае в репозитории присутствует отдельная ветка unicodertl. Вопрос лиш в том, когда оно будет готово.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru