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

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

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

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

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

А ещё не модно вдумыватся в то, что происходит.
Меня больше всего расстроило необдуманное заявление,
Burster_TIL писал(а):Всё равно работает медленней раз в 7 чем Delphi

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

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

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

Сообщение Pavia » 01.07.2015 17:02:57

Среда а вернее отладчик на тест влияет мало. Только если вы поставить прерывание с условием. Тогда код будет тормозится на проверку условия. Что отрицательно скажется на результатах.
Что касается Ctrl+F9 то это считай что запуск. Лучше через меню принудительно всё пере собрать. Правда совет больше касается Delphi XE в котором работает инкрементная компиляция.

По поводу оптимизации. В лазарусе включается
"Проекты" -> "Параметры проекта"->"Параметры компилятора"-> "Параметры проекта"-> "Компиляция и компоновка"->"Уровни оптимизации"


Код: Выделить всё
{$ASMMODE Intel}

FUNCTION RDTSC:Int64;ASSEMBLER;REGISTER; //Ýòî èçâëå÷åíèå òèêîâ â FPC
Asm
RDTSC
End;

FUNCTION HexToSymbol(b:Byte):Byte; //Ïðîñòàÿ ïðîöåäóðà
Begin
if b<58 then HexToSymbol:=b-48;
if b>64 then HexToSymbol:=b-55;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
b:Byte;
T1,t2:int64;
i:integer;
begin
T1:=RDTSC;
for i:=0 to 1000 do
Begin
B:=HEXToSymbol(100);
End;
T2:=RDTSC;
Memo1.Lines.Add(Format('%d',[T2-T1]));
end;                   


В данном тесте участвовал старичок Delphi 7 (а не современник Delphi XE7)
В Delphi 7 и младших оптимизация всегда постоянная. Галочка никак не влияет.
Delphi 7
7464
7459
7459
Lazarus 1.4
-O1 (или параметр по умолчанию)
12844
13223
12864
-O2
5478
5463
5719
-O3 (по идеи тут мог бы код и побыстрее)
5478
5490
5620

Если закомментировать:
// B:=HEXToSymbol(100);
Оба компилятора не выкинули цикл. Хотя при определенных условиях они могут это сделать.
Delphi 7
1001
1001
978
Lazarus 1.4 (FPC 2.6.4)
-O1
5706
5559
5548
-O2
1021
1030
1004
-O3
984
1033
1009

В целом работа оптимизатора меня не устраивает что первого что второго.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Burster_TIL » 01.07.2015 18:00:02

скалогрыз писал(а):Очевидно, что не спец-заточенность FPC под i386 добавляет чуточку лишних инструкций.
Вывод - бросать этот поганый FPC и писать под x86_64 и линуксы на Delphi 7


Лучше проверить с пустым циклом. Там разница во времени куда как более существенная. При чём, в цикл я для пробы поставил присвоение какой-то переменной какого-то значения, чтобы компилятор не выбросил цикл. Всё равно - разница в разы. Бросить FPC это всегда можно успеть. Я просто решил наоборот недавно его попробовать. Наслушался в сети хвалебных отзывов про быстродействие. А оно оказывается вон как. Как-то было сравнивал старый Borland Pascal с TMT Pascal. Вот там разница в быстродействии, конечно, порадовала.

Добавлено спустя 2 минуты 4 секунды:
Sharfik писал(а):Не модно сейчас работать на ворованном.


Я за модой не гонюсь. Мне важен результат.

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


Оно не необдуманное. Оно просто тупо посчитанное. Так устраивает?

Добавлено спустя 2 минуты 13 секунд:
скалогрыз писал(а):То что FPC генерирует код для некоторых случаев, более медленный, чем Delphi или скажем GCC, это известный факт. (FPC позиционировал себя изначально как кросс-платформенный компилятор, и поддержка разных CPU получила приоритет, над заточкой под конкретные компиляторы)

Но код медленее не в разы, убедится в этом совершенно не трудно (проект я приложил). Это же компилируемый язык, не яваскрипт!


Для кроссплатформенных сред используются разные компиляторы. Выбрал win32 и работаешь с одним. Можно сделать его и оптимизирующим. Код в простом цикле в котором есть просто присвоение переменной некоего значения медленней именно в разы.

Добавлено спустя 1 минуту 32 секунды:
Pavia писал(а):"Проекты" -> "Параметры проекта"->"Параметры компилятора"-> "Параметры проекта"-> "Компиляция и компоновка"->"Уровни оптимизации"


Я спрашивал не про Lazarus, а про тубовижиновскую оболочку у FPC. Из неё и я именно и работал. Вот в ней где задаётся оптимизация?

Добавлено спустя 2 минуты 8 секунд:
Pavia писал(а):В данном тесте участвовал старичок Delphi 7 (а не современник Delphi XE7)
В Delphi 7 и младших оптимизация всегда постоянная. Галочка никак не влияет.
Delphi 7
7464
7459
7459
Lazarus 1.4
-O1 (или параметр по умолчанию)
12844
13223
12864
-O2
5478
5463
5719
-O3 (по идеи тут мог бы код и побыстрее)
5478
5490
5620

Если закомментировать:
// B:=HEXToSymbol(100);
Оба компилятора не выкинули цикл. Хотя при определенных условиях они могут это сделать.
Delphi 7
1001
1001
978
Lazarus 1.4 (FPC 2.6.4)
-O1
5706
5559
5548
-O2
1021
1030
1004
-O3
984
1033
1009

В целом работа оптимизатора меня не устраивает что первого что второго.


Да, занятно.
Я проверял не в Lazarus, а в штатной оболочке к FPC. Как в ней менять оптимизацию компиляции кода?
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

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

Сообщение Лекс Айрин » 01.07.2015 18:14:35

Burster_TIL писал(а):Я проверял не в Lazarus, а в штатной оболочке к FPC. Как в ней менять оптимизацию компиляции кода?


options/compiler... /Generated code

нашел моментально.
Последний раз редактировалось Лекс Айрин 01.07.2015 18:17:12, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение скалогрыз » 01.07.2015 18:15:48

Burster_TIL писал(а):Оно не необдуманное. Оно просто тупо посчитанное. Так устраивает?

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

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

Сообщение Burster_TIL » 01.07.2015 18:19:34

скалогрыз писал(а):согласен - очень тупо посчитанное.



Тупо делим Т2 на Т1 и получаем результат. Есть варианты как считать соотношение производительности в данном случае иначе?

Добавлено спустя 6 минут 35 секунд:
Лекс Айрин писал(а):options/compiler... /Generated code

нашел моментально.


Поставил Level 3 OPtimization как было так и осталось 6720 для FPC, в то время, как delphi даёт 1982. Слишком уж ощутимая разница.
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

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

Сообщение скалогрыз » 01.07.2015 18:33:02

а вот с таким кодом
Код: Выделить всё
program Project2;
{$APPTYPE CONSOLE}
{$IFDEF FPC}
{$MODE DELPHI}
{$ASMMODE INTEL}
{$ENDIF}

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

type
  TRDTSC_TimeStamp = record
  case byte of
    0: (Lo : LongWord; Hi : LongWord);
    1: (Whole: Int64);
  end;

var
RDTSC_TimeStamp: TRDTSC_TimeStamp;

FUNCTION RDTSC_Int64:Int64;
Begin
Asm
db $0F; db $31;
{$IFDEF Cpu386}
mov [RDTSC_TimeStamp.Lo], eax
mov [RDTSC_TimeStamp.Hi], edx
{$ELSE}
db D32
mov word ptr RDTSC_TimeStamp.Lo, AX
db D32
mov word ptr RDTSC_TimeStamp.Hi, DX
{$ENDIF}
End;
  Result:=RDTSC_TimeStamp.Whole;
End;

var
  t1: int64;
  t2: Int64;
  i : INteger;
  b : Byte;
begin
  T1:=RDTSC_Int64; //RDTSC_Int64;
  for i:=0 to 1000 do
  Begin
    B:=HEXToSymbol(100);
  End;
  T2:=RDTSC_Int64; // RDTSC_Int64;
  writeln(t2-t1);
end.

Delphi выдаёт на гора 12000, а FPC (без оптимизации) 11000, а оптимизацией 9100.

Добавлено спустя 41 секунду:
2 Burster_TIL, есть мнение, что ты делаешь что-то очень-очень не так. Как показывал ассемблерный код, тормозов чтобы дать разницу в разы нет.

Добавлено спустя 39 секунд:
Burster_TIL писал(а):Тупо делим Т2 на Т1 и получаем результат

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

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

Сообщение Burster_TIL » 01.07.2015 18:44:37

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


Открою секрет. Для вычисления соотношения быстродействия нужно именно делить. ну, или совсем на пальцах,- если один компилятор быстрее другого в два раза то значит Т1 меньше Т2 в два раза. Вопросы есть?
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

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

Сообщение Лекс Айрин » 01.07.2015 18:47:05

Burster_TIL, если хочешь очень быстро, то тебе надо самому добавить оптимизацию в компилятор. Вот только тогда проще все написать заново.

Burster_TIL писал(а):Поставил Level 3 OPtimization


И все? На большее фантазии не хватило?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Burster_TIL » 01.07.2015 18:47:36

скалогрыз писал(а):2 Burster_TIL, есть мнение, что ты делаешь что-то очень-очень не так. Как показывал ассемблерный код, тормозов чтобы дать разницу в разы нет.


А. что тут можно сделать не так? Есть два компилятора с в груженными в них сорцами программ, которые я присылал. Как результат время выполнения программы, созданной одним компилятором в разы меньше времени выполнения программы, созданной другим компилятором. Включение Level 3 optimization в настройках среды FPC (не Lazarus) положительных результатов не дало.

Добавлено спустя 41 секунду:
Лекс Айрин писал(а):И все? На большее фантазии не хватило?


Фантазировать не нужно. Я выставил 3-й уровень оптимизации. Результат не дало. Что-то нужно ещё?

Добавлено спустя 5 минут 1 секунду:
скалогрыз писал(а):Delphi выдаёт на гора 12000, а FPC (без оптимизации) 11000, а оптимизацией 9100.


9100 не удалось получить. Везде 12400 или около того. Выставление опций компиляции на результат не влияет.
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

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

Сообщение скалогрыз » 01.07.2015 19:15:45

Burster_TIL писал(а):А. что тут можно сделать не так? Есть два компилятора с в груженными в них сорцами программ, которые я присылал.

Тут нужно заметить, что сорцы ты не прислал. Ты прислал только вырезки из кода.
Например, где объявлена переменная RDTSC_TimeStamp ? и где сделана условная компиляция для FPC и Delphi?
у тебя же два разных проекта получается.

И если ты грешишь на FPC среду - то почему бы тебе не скомпилировать проект из командной строки и из неё же не запустить?
И так же не запустить проект из Delphi?

Burster_TIL писал(а):9100 не удалось получить. Везде 12400 или около того. Выставление опций компиляции на результат не влияет.

12400 и в Delphi тоже?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Burster_TIL » 01.07.2015 19:25:48

скалогрыз писал(а):Тут нужно заметить, что сорцы ты не прислал. Ты прислал только вырезки из кода.
Например, где объявлена переменная RDTSC_TimeStamp ? и где сделана условная компиляция для FPC и Delphi?
у тебя же два разных проекта получается.

И если ты грешишь на FPC среду - то почему бы тебе не скомпилировать проект из командной строки и из неё же не запустить?
И так же не запустить проект из Delphi?


RDTSC_TimeStamp:Record
Case Byte of
1:(Whole:Int64);
2:(Lo,Hi:Longint);
End;
Условия компиляции в FPC изменений не дали. В D7 вообще ничего не менял из условий. Всё по умолчанию. Запуск не из среды FPC даёт точно такие же результаты для его же программы. Ровно так же и с D7. Что из среды её запускай, что просто экзешник - результат один. Из командной строки не компилил. Привык к средам. Неужели будет разница?
Burster_TIL
новенький
 
Сообщения: 46
Зарегистрирован: 25.09.2013 02:05:28

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

Сообщение скалогрыз » 01.07.2015 19:31:08

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

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

Сообщение Burster_TIL » 01.07.2015 19:32:01

скалогрыз писал(а):12400 и в Delphi тоже?


Вместо HexToSymbol я в цикл вписал a:=0;. a - integer;
И получил что FPC показывает 6730, а D7 - 1982. То есть D7 тут быстрее в 3.4 раза.

Добавлено спустя 1 минуту 47 секунд:
скалогрыз писал(а):Ну хватит код кусками выдавать. Целиком проекты! Целиком!
Заархивируй и добавь к сообщению!


var
Form1: TForm1;
RDTSC_TimeStamp:Record
Case Byte of
1:(Whole:Int64);
2:(Lo,Hi:Longint);
End;

Дельфийский код.

implementation

{$R *.dfm}

FUNCTION RDTSC_Int64:Int64;
Begin
Asm
db $0F; db $31;
{$IFDEF Cpu386}
mov [RDTSC_TimeStamp.Lo], eax
mov [RDTSC_TimeStamp.Hi], edx
{$ELSE}
db D32
mov word ptr RDTSC_TimeStamp.Lo, AX
db D32
mov word ptr RDTSC_TimeStamp.Hi, DX
{$ENDIF}
End;
Result:=RDTSC_TimeStamp.Whole;
End;

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

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);
end;

FPC код
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;
var
T1,T2:Int64;
B:Byte;
i,j,a:Longint;
Begin
(*
for i:=0 to 10 do
Begin
WriteLn(Get__RDTSC);
End;
*)
ClrScr;
ReadKey;
for j:=0 to 19 do
Begin
T1:=Get__RDTSC;
for i:=0 to 1000 do
Begin
//B:=HexToSymbol(100);
a:=0;
End;
T2:=Get__RDTSC;
WriteLn(T2-T1);
End;
//WriteLn(T1);
//WriteLn(T2);

ReadKey;

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

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

Сообщение Лекс Айрин » 01.07.2015 20:17:11

Burster_TIL писал(а):Фантазировать не нужно. Я выставил 3-й уровень оптимизации. Результат не дало. Что-то нужно ещё?


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

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

Пред.След.

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

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

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

Рейтинг@Mail.ru