Сравнение FPC и GPC

Любые обсуждения, не нарушающие правил форума.

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

Сообщение STAKANOV » 12.11.2005 14:51:10

Есть ли у кого информация о сравнении качества генерируемого кода FPC и GPC?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Иван Шихалев » 13.11.2005 02:15:36

Что значит "качество генерируемого кода"?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 13.11.2005 03:04:40

Иван Шихалев писал(а):Что значит "качество генерируемого кода"?

Банально - что лучше?

Кстати вот -
test.pas
Код: Выделить всё
unit test;

interface
implementation
procedure test1;
var
   i:LongInt;
begin
   i:=10;
   inc(i);
end;

end.


FPC:
Код: Выделить всё
...
TEST_TEST1:
       pushl   %ebp
       movl    %esp,%ebp
       subl    $4,%esp
       movl    $10,-4(%ebp)
       incl    -4(%ebp)
       leave
       ret
...


GPC:
Код: Выделить всё
...
Test1:
       pushl   %ebp
       movl    %esp, %ebp
       subl    $8, %esp
       movl    $10, -8(%ebp)
       movl    $0, -4(%ebp)
       leal    -8(%ebp), %eax
       addl    $1, (%eax)
       adcl    $0, 4(%eax)
       leave
       ret
...


Чувствую что FPC лучше ;)

ЗЫ. Жаль мы не знаем что выдало бы Delphi...
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Иван Шихалев » 13.11.2005 03:43:11

Это GPC мощно задвинул, внушаит. Delphi inc() точно в одну инструкцию компилиоует, проверено.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение Иван Шихалев » 13.11.2005 03:48:30

Вообще надо помнить, что:
а) GPC — frontend для GCC. А GCC не может учитывать структуру языка, поскольку ничего о ней не знает.
б) Community & Team у FPC куда активнее…

И все-таки, странно, очень странно смотрится inc() через add… Может у GPC/GCC оптимизация напрочь вырублена?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 13.11.2005 13:00:54

Иван Шихалев писал(а):И все-таки, странно, очень странно смотрится inc() через add… Может у GPC/GCC оптимизация напрочь вырублена?

Я вот так и подумал - а что будет если мы при компиляции укажим опцию -O3. Код просто не попал в ассемблерный файл :) Поэтому я изменил тестовую программу.

test.pas
Код: Выделить всё
unit test;
interface
  function test1(i:LongInt):LongInt;
implementation
  function test1(i:LongInt):LongInt;
  begin
      inc(i);
      test1:=i;
  end;
end.


fpc -a -O3 test.pas
Код: Выделить всё
TEST_TEST1$LONGINT$$LONGINT:
       pushl   %ebp
       movl    %esp,%ebp
       subl    $8,%esp
       movl    %eax,-4(%ebp)
       incl    %eax
       movl    %eax,-4(%ebp)
       movl    %eax,-8(%ebp)
       leave
       ret


gpc -S -O3 test.pas
Код: Выделить всё
Test1:
       pushl   %ebp
       movl    %esp, %ebp
       movl    8(%ebp), %eax
       movl    12(%ebp), %edx
       addl    $1, %eax
       adcl    $0, %edx
       leave
       ret


Любопытный результат. :unsure: GPC по прежнему не стал использовать inc. Кстати здесь явно видно, что по разному передаются параметры. Если мы уравняем это дело немного подправив test.pas :
Код: Выделить всё
function test1(i:LongInt):LongInt;cdecl;


то от FPC мы получим :
Код: Выделить всё
TEST_TEST1$LONGINT$$LONGINT:
       pushl   %ebp
       movl    %esp,%ebp
       subl    $4,%esp
       incl    8(%ebp)
       movl    8(%ebp),%eax
       movl    %eax,-4(%ebp)
       leave
       ret


Единственное что мне здесь не нравиться это
Код: Выделить всё
movl    %eax,-4(%ebp)
- сохранение значения результата функции. Не уверен, что это надо :unsure:

Некотрые выводы:
    - FPC более эффективно компилирует код чем GPC (GPC здесь возможно подводит универсальность самой технологии - GCC)
    - исипользование cdecl уменьшает код и повышает его эффективность</li>
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение pda » 13.11.2005 21:16:53

Х.з. какой gcc? На самом деле в 4-ой ветке появились вкусности, типа автовекторизации и т.д....
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение STAKANOV » 14.11.2005 00:28:03

Atrus писал(а): Х.з. какой gcc? На самом деле в 4-ой ветке появились вкусности, типа автовекторизации и т.д....

..автовекторизации..

шо це такэ ? :)
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение noch » 14.11.2005 11:36:08

Ну и ну, здорово!
Я не ожидал, что fpc уже обходит gcc по качеству генерируемого кода

Спасибо!
Аватара пользователя
noch
постоялец
 
Сообщения: 145
Зарегистрирован: 07.06.2005 09:45:49
Откуда: Armenia

Сообщение Romtek » 14.11.2005 15:05:22

Вот ссылка по теме: <a href='http://forum.sources.ru/index.php?showtopic=102322' target='_blank'> Производительность компиляторов</a> (Тесты для Delphi/FPC/TMT/VP/GPC)
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение pda » 14.11.2005 15:13:46

STAKANOV писал(а):
..автовекторизации..

шо це такэ ? :)


Это когда компилятор находи участки кода (в основном - циклы), которые мозно заменить инструкциями sse/altivec и т.д. и заменяет.

<a href='http://gcc.gnu.org/projects/tree-ssa/vectorization.html' target='_blank'>Auto-vectorization in GCC</a>,
GCC <a href='http://gcc.gnu.org/wiki/Autovectorization%20Enhancements' target='_blank'>Autovectorization Enhancements</a>.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение STAKANOV » 14.11.2005 15:21:35

Romtek писал(а): Вот ссылка по теме: <a href='http://forum.sources.ru/index.php?showtopic=102322' target='_blank'>  Производительность компиляторов</a> (Тесты для Delphi/FPC/TMT/VP/GPC)

Опаньки ... :blink: ... из бесплатных лидирует GPC

Можешь проврить что он выдает при транслировании в ассеблер моего простенького примера ? Очень интресно - измени ли они транслирование inc.

дело в том что у меня на FreeBSD удалось собрать только GPC 20041218 :( у меня BISON только 1.875, а для более свежих нужен 2.0, но такого пока нет в портах, а собирать его из исходников я пока не пробывал ...
----
Попробывал и оказалось не зря, собрал GPC 20050331 - результат тот же
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV » 14.11.2005 16:45:53

И вот еще - мысль :rolleyes: От gcc все это никак не зависит, это завсит от того как выглядит входной файл для BISON(это почи тоже что и YACC), в нем определеятся какой код буд сформирован, если я не ошибаюсь.
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Skazochnik » 14.11.2005 18:53:51

вот вы пишете что fcp круче gpc они оба генерят полностью фуфлыжный код в данном случае который будет выполнятся дольше чем надо заметно. Любой более менее путний компилер первыйс лучай сгенерит в пустышку а торой где не процедура от силы в 3 комманды и то вместе с ret.
Skazochnik
 

Сообщение STAKANOV » 14.11.2005 19:31:26

Любой более менее путний компилер первыйс лучай сгенерит в пустышку

это произошло после включения оптимизации -O, поэтому появился второй вариант
от силы в 3 комманды и то вместе с ret.


такой ?
Код: Выделить всё
test1:
   incl   4(%esp)
   movl 4(%esp),%eax
   ret


а если он еще и парметры чере регистр передает (fpc так умеет), то
Код: Выделить всё
test1:
    incl %eax
    ret

жаль вот только такого компилера нет :(
----
кстати:
не паскаль, но ... GCC 3.4.4 (gcc -S -O3):
Код: Выделить всё
int test1(int i){
return ++i;
}


результат:
Код: Выделить всё
test1:
       pushl   %ebp
       movl    %esp, %ebp
       movl    8(%ebp), %eax
       incl    %eax
       leave
       ret
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

След.

Вернуться в Потрепаться

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

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

Рейтинг@Mail.ru
cron