Медленный компилятор FPC

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

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

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 20:56:16

Burster_TIL писал(а):Вместо HexToSymbol я в цикл вписал a:=0;. a - integer;

Ну шикарно же! дававйте сранивать локальные и глобальные переменные с вложенными циклами.

Замени свой FPC тест на вот такой код
Код: Выделить всё
uses crt;

FUNCTION HexToSymbol(b:Byte):Byte;
Begin
if b<58 then HexToSymbol:=b-48;
if b>64 then HexToSymbol:=b-55;
End;

FUNCTION Get__RDTSC:Int64;ASSEMBLER;REGISTER;
Asm
  RDTSC
End;

function BigTest: Int64;
var
  T1,T2:Int64;
  B:Byte;
  a:Longint;
  i:Longint;
Begin
T1:=Get__RDTSC;
for i:=0 to 1000 do
Begin
   // B:=HexToSymbol(100);
   a:=0;
End;
T2:=Get__RDTSC;
BigTest:=T2-T1;
End;

var
  i : integer;
  t : int64;
begin
  clrscr;
  readkey;
  for i:=0 to 19 do begin
    t:=BigTest;
    writeln(t);
  end;
  readkey;
end.

и проверь результаты.

и не забудь выставить опимизацию, как показано на картинке!

Добавлено спустя 7 минут 48 секунд:
А если ещё и поменяешь свой делфи код на скажем такой:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  i,a:Integer;
  T1,T2:Int64;
  B:Byte;
begin
  T1:=RDTSC_Int64;
  for i:=0 to 1000 do
  Begin
    //B:=HEXToSymbol(100);
    a:=0;
  End;
  T2:=RDTSC_Int64;
  Edit1.Text:=IntToStr(T2-T1);
  Edit2.Text:=IntToStr(T1);
  Caption:=IntToStr(a); // эта строка - новая! нужная! полезная!
end;

то вообще добъёшься идентичный результатов.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 01.07.2015 21:06:17

Лекс Айрин писал(а):Есть еще резервы. Они все на той вкладке. Причем, они идут помимо оптимизации 3 уровня. Например, создание умных ссылок, генерация минимального кода... в крайнем случае, можно отменить проверки на выход из диапазона.

И не забывайте, о том, что дельфи постарше будет. Он вообще летать должен. Да и никто не запрещает лично Вам вставить ассемблерный код. Или переписать (подправить) компилятор.


Перепробовал. Положительного ничего не вышло. Словно есть эта оптимизация, словно её нет. Я не говорю что Delphi моложе. Но туда насовали много разных компонент и библиотек. Тут всё ощутимо скромнее. Можно было бы сделать боеле шустрый компилятор. Править код компилятора мне? Зачем? Я решаю свои задачи, а не занимаюсь модификацией компиляторов. Тем более, если бы было возможно его ещё сильнее сделать оптимизирующем, то это давно бы уже сделали. Однако, какие-то есть трудности.

Добавлено спустя 4 минуты 56 секунд:
скалогрыз писал(а):то вообще добъёшься идентичный результатов.


Да не важно что там стоит после T2:=RDTSC_Int64; Хоть миллион строк разного кода.
И так, запускаем в FPC получаем 6720 тиков. Запускаем это же самое в D7, получаем 1982 тика. Комментарии, как говорится, излишни.
Думал, что FPC окажется быстрее. А он оказался медленнее, да ещё так, что кошмар просто. D7 быстрее сделал в 3.4 раза.
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 21:12:04

Естественно, если FPC код переписать на
Код: Выделить всё
function BigTest: Int64;
var
  T1,T2:Int64;
  B:Byte;
  a:Longint;
  i:Longint;
Begin
T1:=Get__RDTSC;
i:=1000;
while i>=0 do
Begin
   // B:=HexToSymbol(100);
   a:=0;
   dec(i);
End;
T2:=Get__RDTSC;
BigTest:=T2-T1;
End;

то результаты совпадут ещё точнее, но это уже читерство будет :mrgreen:

Добавлено спустя 3 минуты 12 секунд:
Burster_TIL писал(а):Да не важно что там стоит после T2:=RDTSC_Int64; Хоть миллион строк разного кода.
И так, запускаем в FPC получаем 6720 тиков. Запускаем это же самое в D7, получаем 1982 тика. Комментарии, как говорится, излишни.
Думал, что FPC окажется быстрее. А он оказался медленнее, да ещё так, что кошмар просто. D7 быстрее сделал в 3.4 раза.

ты FPC код не менял? и оптимизацию не выставил?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 01.07.2015 21:18:27

скалогрыз писал(а):то результаты совпадут ещё точнее, но это уже читерство будет


Совпадут? Ну щаз!
Скомилил указанный код с While в обеих компиляторах. Delphi-7 дал 1985 - то есть почти без изменений.
FPC дал 7380. Такие вот пироги с котятами. То есть соотношение уже 3.7. То есть while в FPC работает медленнее for.

Добавлено спустя 2 минуты 27 секунд:
скалогрыз писал(а):ты FPC код не менял? и оптимизацию не выставил?


Делал и с for и с while. Второе работает даже медленнее в FPC. В Delphi While работает почти так же. Разница в доли процента.
В оптимизации стоит I/O Checking и Level 3 Optimization
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 21:46:49

Пирожки с котятами... анимированный скриншот.

я уже не могу тебя больше убеждать, т.к. наглядно доказательная база у меня исчерпана.
А техническую ты не знаешь и не прислушиваешься.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 01.07.2015 21:57:40

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


А, в чём убеждать? Я создаю одинаковый код в D7 и FPC. И вижу, что он (FPC) работает в разы медленнее. Так что чего такого я не знаю?
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 21:59:21

Burster_TIL писал(а):Так что чего такого я не знаю?

ты не знаешь ассемблера, ты не знаешь где увидеть разницу.
по-этому ты не можешь добится, чтобы на FPC код работал так же быстро как и в Delphi (как показано на видео).

Но плюс в том, что в реальной программе, а не специально написанном тесте, тебе это не понадобится и производительность будет идентичной.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение Kemet » 01.07.2015 22:03:24

Burster_TIL,
модель процессора?
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 01.07.2015 22:05:58

скалогрыз писал(а):Ну шикарно же! дававйте сранивать локальные и глобальные переменные с вложенными циклами.


ОК. Сделал всё в виде отдельной процедуры в FPC. Там теперь только локальные переменные, как в D7.
Стало несколько лучше.
3076 у FPC и 1982 у Delphi.
Но, как-то всё равно не впечатляет.

Добавлено спустя 2 минуты 42 секунды:
скалогрыз писал(а):ты не знаешь ассемблера, ты не знаешь где увидеть разницу.
по-этому ты не можешь добится, чтобы на FPC код работал так же быстро как и в Delphi (как показано на видео).

Но плюс в том, что в реальной программе, а не специально написанном тесте, тебе это не понадобится и производительность будет идентичной.


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

Добавлено спустя 1 минуту 21 секунду:
Kemet писал(а):модель процессора?


i7 920 Bloomfield
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 22:16:11

Burster_TIL писал(а):Программы пишутся в основном на языках высокого уровня, а не на ассемблере. Да, разница была, в глобальных и локальных переменных. Странно, конечно, но результат изменился, но не сказать. что впечатляет. А реальная программа и состоит из подобных кусков, где циклы и вызовы таких-то ф-ций, которых опять же свои циклы. Так что тест - вполне наглядный. Интегрально оно будет работать так же медленней.

ну а процессор паскаль исполняет или что-то более низкого уровня?
Если бы ты знал ассембер... а ты его не знаешь, хотя козалось бы используешь его для замерения времени. (хехе!)
... так вот, если бы ты знал ассемблер, то ты бы увидел в чём разница во времени.
Ты бы понял, что эта разница имеет значение только для этого теста, а в более продуктивном коде, разницы не будет вообще.

Добавлено спустя 4 минуты 47 секунд:
Burster_TIL писал(а):ОК. Сделал всё в виде отдельной процедуры в FPC. Там теперь только локальные переменные, как в D7.

это код скопирован, или ты по своему сделал виде отдельной процедуры?
Код: Выделить всё
    uses crt;

    FUNCTION HexToSymbol(b:Byte):Byte;
    Begin
    if b<58 then HexToSymbol:=b-48;
    if b>64 then HexToSymbol:=b-55;
    End;

    FUNCTION Get__RDTSC:Int64;ASSEMBLER;REGISTER;
    Asm
      RDTSC
    End;

    function BigTest: Int64;
    var
      T1,T2:Int64;
      B:Byte;
      a:Longint;
      i:Longint;
    Begin
    T1:=Get__RDTSC;
    for i:=0 to 1000 do
    Begin
       // B:=HexToSymbol(100);
       a:=0;
    End;
    T2:=Get__RDTSC;
    BigTest:=T2-T1;
    End;

    var
      i : integer;
      t : int64;
    begin
      clrscr;
      readkey;
      for i:=0 to 19 do begin
        t:=BigTest;
        writeln(t);
      end;
      readkey;
    end.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 01.07.2015 22:45:30

скалогрыз писал(а):это код скопирован, или ты по своему сделал виде отдельной процедуры?


Странно, но вот эта процедура показывает большее время, чем та, что ты прислал. Тут тоже все переменные локальные. Разница в том, что 20 раз вычисляется внутри процедуры и выводится в ней же на экран.
PROCEDURE Test_Speed;
var
T1,T2:Int64;
i,j,a:Longint;
Begin
ClrScr;
ReadKey;
for j:=0 to 19 do
Begin
i:=1000;
T1:=Get__RDTSC;
for i:=0 to 1000 do
Begin
a:=0;
End;
T2:=Get__RDTSC;
WriteLn(T2-T1);
End;
ReadKey;
End;
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 01.07.2015 23:01:38

в этом нет ничего странного.
берёшь командную строку и компилируешь файл примерно следующим образом
Код: Выделить всё
fpc -al test.pas

или
Код: Выделить всё
fpc -al -O3 test.pas

по вкусу.
(где test.pas нужно заменить нужным именем файла)
в результате у тебя появится файлик test.s.
в нём будет ассебмлер, который собственно и попадает в результирующий .ехе файл. Если его прочитаешь, то поймёшь откуда берутся тормоза.
Почему бы тебе в Delphi не сделать вложенны цикл? для более точного сравнения производительности.
Не удивлюсь, если Delphi вновь окажется быстрее.

Срачи по поводу оптимизатора FPC идут постоянно.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Медленный компилятор FPC

Сообщение alex208210 » 02.07.2015 14:11:28

Burster_TIL, для примера сравним двигатели от автомобиля например газ 66. Ты крадешь себе ГАЗ-САЗ-3531, самосвал для сельского хозяйства (delphi) и тебе дарят 9К54 «Град-В» — советская десантируемая реактивная система залпового огня(Lazarus) (тот же газ 66 но вместо гавновозки.. система залпового огня).
Ты берешь 9К54 «Град-В» накидываешь говна на ракетницу как ты это делал с сельким вариантом где был кузов, и говоришь.. вот херня.. три лопаты положил а уже все валится. Ладно. Садишься за руль 9К54 «Град-В» даешь газу.. а он разгоняется в три раза медленнее сельского варианта, потому что ракетница в 20 раз тяжелее кузова. В результате делаешь вывод: 9К54 «Град-В» плохая машина а ГАЗ-САЗ-3531 хорошая потому что в ГАЗ-САЗ-3531 входит больше говна и разгоняется она в три раза быстрее. Потом ты заходишь на форум и пишешь: "я включаю таймер и ГАЗ-САЗ-3531 приезжаешь быстрее. о чем тут вообще можно говорить, вы что не видите????"

А теперь подумай головой и пойми что ты делаешь не так.
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Медленный компилятор FPC

Сообщение Burster_TIL » 02.07.2015 16:17:07

скалогрыз писал(а):по вкусу.
(где test.pas нужно заменить нужным именем файла)
в результате у тебя появится файлик test.s.
в нём будет ассебмлер, который собственно и попадает в результирующий .ехе файл. Если его прочитаешь, то поймёшь откуда берутся тормоза.
Почему бы тебе в Delphi не сделать вложенны цикл? для более точного сравнения производительности.
Не удивлюсь, если Delphi вновь окажется быстрее.


Не совсем так. Я говорил про то, что я компилирую две ф-ции в одном проекте. Она ниже. И у неё ощутимо большее число тиков выходит. Твоя и эта компилируется при одинаковых условиях. Ибо это всё в одном проекте.
PROCEDURE Test_Speed;
var
T1,T2:Int64;
i,j,a:Longint;
Begin
ClrScr;
ReadKey;
for j:=0 to 19 do
Begin
i:=1000;
T1:=Get__RDTSC;
for i:=0 to 1000 do
Begin
a:=0;
End;
T2:=Get__RDTSC;
WriteLn(T2-T1);
End;
ReadKey;
End;

Добавлено спустя 3 минуты 49 секунд:
alex208210 писал(а):Burster_TIL, для примера сравним двигатели от автомобиля например газ 66. Ты крадешь себе ГАЗ-САЗ-3531, самосвал для сельского хозяйства (delphi) и тебе дарят 9К54 «Град-В» — советская десантируемая реактивная система залпового огня(Lazarus) (тот же газ 66 но вместо гавновозки.. система залпового огня).
Ты берешь 9К54 «Град-В» накидываешь говна на ракетницу как ты это делал с сельким вариантом где был кузов, и говоришь.. вот херня.. три лопаты положил а уже все валится. Ладно. Садишься за руль 9К54 «Град-В» даешь газу.. а он разгоняется в три раза медленнее сельского варианта, потому что ракетница в 20 раз тяжелее кузова. В результате делаешь вывод: 9К54 «Град-В» плохая машина а ГАЗ-САЗ-3531 хорошая потому что в ГАЗ-САЗ-3531 входит больше говна и разгоняется она в три раза быстрее. Потом ты заходишь на форум и пишешь: "я включаю таймер и ГАЗ-САЗ-3531 приезжаешь быстрее. о чем тут вообще можно говорить, вы что не видите????"


Занятная аллегория. Можно узнать, что Вы там у себя курите? По ходу что-то очень забористое. А про Delphi на предмет сравнения его с ГАЗ а Lazarus с град. Пишеи ещё. Давно так не хохотал. А если по делу, то если Delphi есть средство для написания программ, а Lazarus есть средство для выжимания мокрого белья (как аналогия грузовик ГАЗ и ракетная устновка), то да - их сравнивать не имеет смысла. Но, что-то мне подсказывает, что обе эти среды предназначены для разработки программ. Или, я ошибаюсь?
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

Re: Медленный компилятор FPC

Сообщение скалогрыз » 02.07.2015 16:47:29

Burster_TIL писал(а):Не совсем так. Я говорил про то, что я компилирую две ф-ции в одном проекте. Она ниже. И у неё ощутимо большее число тиков выходит. Твоя и эта компилируется при одинаковых условиях. Ибо это всё в одном проекте.

Давай для начала договоримся о таких вещах, чтобы все кто читает этот форум понимали лучше.
1) Когда ты говоришь в "одном проекте" то ты сразу прилагай весь текст программы, желательно аттачем (положенным в .zip). Отлаживать куски кода очень и очень неблагодарное дело.
2) нету "твоей" и "этой" функции. Т.к. яваскрипт ещё не полностью захавал мозг делфи программистам, мы всё ещё присваиваем имена процедурам и функциями. И по-этому используй выражения вроде. "Я говорил про то, что я компилирую две ф-ции в одном проекте. Она -Test_Speed - ниже. И у неё ощутимо большее число тиков выходит. Твоя (BigTest) и эта (Test_Speed) компилируется при одинаковых условиях"
3) пожалуйста используй тэг code (статья на английском но с картинками понятно!)
Это важно, т.к. если ты и я может кое-как и понимаем где чья функия, другие участники не поймут.

Ну а теперь о разнице! Как я говорил выше, если ты скомпилируешь програмку с ключиком "-al" то у тебя появится ассебмлерный код.
Но лучше сделать даже так:
Код: Выделить всё
fpc -al -O3 -Amasm test.pas

Разница будет в синтаксисе ассебмлера. Если использовать -Amasm то ассебмлер будет в Интеловском-синтаксе, который может увидеть и в Delphi. Очень удобно для сравнения скажем Delphi и FPC кода.

Так вот, смотрим в ассемблеры. Цикл для Test_Speed выглядит следующий образом
Код: Выделить всё
; [35] for j:=0 to 19 do
      mov   dword ptr [ebp-20],0
      dec   dword ptr [ebp-20]
   ALIGN 4
@@j34:
      inc   dword ptr [ebp-20]
; [37] i:=1000;
      mov   dword ptr [ebp-4],1000
; [38] T1:=Get__RDTSC;
      call   P$PROGRAM_GET__RDTSC$$INT64
      mov   dword ptr [ebp-16],eax
      mov   dword ptr [ebp-12],edx
; [39] for i:=0 to 1000 do
      mov   dword ptr [ebp-4],0
      dec   dword ptr [ebp-4]
   ALIGN 4
@@j41:
      inc   dword ptr [ebp-4]
; [41] a:=0;
      mov   ebx,0
      cmp   dword ptr [ebp-4],1000
      jl   @@j41
; [43] T2:=Get__RDTSC;
      call   P$PROGRAM_GET__RDTSC$$INT64
      mov   dword ptr [ebp-8],eax
      mov   esi,edx

а цикл для BigTest выглядит так:
Код: Выделить всё
; [21] T1:=Get__RDTSC;
      call   P$PROGRAM_GET__RDTSC$$INT64
      mov   ebx,eax
      mov   esi,edx
; [22] i:=1000;
      mov   eax,1000
; [23] for i:=0 to 1000 do
      mov   edx,0
      dec   edx
   ALIGN 4
@@j23:
      inc   edx
; [25] a:=0;
      mov   eax,0
      cmp   edx,1000
      jl   @@j23
; [26] T2:=Get__RDTSC;
      call   P$PROGRAM_GET__RDTSC$$INT64

Так вот, обрати внимание что в коде Test_Speed можно часто увидеть выражение вроде:
Код: Выделить всё
dword ptr [ebp-NNN]

а в коде BigTest их нет вообще. И это причина тормозов - dword ptr [ebp-NNN] - заставляет процессор оперировать с памятью.
Тогда как BigTest оперирует не с памятью а исключительно с регистрами процессора.

Почему FPC так сделал. Обычно счётчики цикла лежат в регистре, а не памяти процессора, но т.к. у тебя есть вложенный цикл, то регистров (коих мало) на всё не хватит, и FPC генерирует код, который оперирует с памятью. Что вызывает "тормоза" но зато код работает.

В реальной жизни, когда цикл будет делать нечто большее, чем просто присваивать 0 в переменную a, оперирования с памятью не избежать вообще, и скорость сравняется и между циклами и между компиляторами (delphi и fpc).
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 1

Рейтинг@Mail.ru