Сравнение FPC и GPC
Модератор: Модераторы
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Иван Шихалев писал(а):Что значит "качество генерируемого кода"?
Банально - что лучше?
Кстати вот -
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
- Откуда: Екатеринбург
- Контактная информация:
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Иван Шихалев писал(а):И все-таки, странно, очень странно смотрится 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
retgpc -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)Некотрые выводы:
- - FPC более эффективно компилирует код чем GPC (GPC здесь возможно подводит универсальность самой технологии - GCC)
- исипользование cdecl уменьшает код и повышает его эффективность</li>
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>.
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
----
Попробывал и оказалось не зря, собрал GPC 20050331 - результат тот же
-
Skazochnik
Любой более менее путний компилер первыйс лучай сгенерит в пустышку
это произошло после включения оптимизации -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