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

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

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

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

Сообщение STAKANOV »

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

Сообщение Иван Шихалев »

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

Сообщение STAKANOV »

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

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

Кстати вот -
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...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

Сообщение Иван Шихалев »

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

И все-таки, странно, очень странно смотрится inc() через add… Может у GPC/GCC оптимизация напрочь вырублена?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Иван Шихалев писал(а):И все-таки, странно, очень странно смотрится 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>
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Х.з. какой gcc? На самом деле в 4-ой ветке появились вкусности, типа автовекторизации и т.д....
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

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

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

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

Сообщение noch »

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

Спасибо!
Аватара пользователя
Romtek
постоялец
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган
Контактная информация:

Сообщение Romtek »

Вот ссылка по теме: <a href='http://forum.sources.ru/index.php?showtopic=102322' target='_blank'> Производительность компиляторов</a> (Тесты для Delphi/FPC/TMT/VP/GPC)
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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>.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

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 »

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

Сообщение Skazochnik »

вот вы пишете что fcp круче gpc они оба генерят полностью фуфлыжный код в данном случае который будет выполнятся дольше чем надо заметно. Любой более менее путний компилер первыйс лучай сгенерит в пустышку а торой где не процедура от силы в 3 комманды и то вместе с ret.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

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

это произошло после включения оптимизации -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
Ответить