Модератор: Модераторы
alex208210 писал(а):о какова разница работы цикла delphi и fpc в linux ?
Burster_TIL писал(а):Время замерял и там и там функцией RDTSC. То есть в тиках процессора.
скалогрыз писал(а):если замеры ведутся функцией RDTSC то нужно сразу же показывать листинг assembler-а из Delphi и FPC, без лишних вопросов.
*Rik* писал(а):Да пофиг. Вы на FPC драйвера что-ли писать собрались? Для меня есть понятие приемлемое быстродействие, в этом плане FPC для моих задач более чем. Для меня главное переносимость между платформами, в т.ч. приложений с GUI, а вопрос чего там быстрее вообще на последнем месте. FPC и Lazarus прошли долгий и сложный путь, у разработчиков нет таких ресурсов как у Эмбаркадеро, взамен мы можем использовать его абсолютно бесплатно и на сегодняшний день, компилятор FPC и Lazarus накопили достаточный вес, что-бы например я, ушел на них с лицензионного Delphi, а всякая ерунда типа размер исполняемых файлов больше, быстродействие дельфийскому ПО уступает - это незначительные мелочи, которые меркнут по сравнению с "Написав один раз, собирай везде".
Pavia писал(а):шибка в коде. В зависимости от теста можно получить разные результаты. И методика тестирования тоже опишите. Она тоже влияет.
Sharfik писал(а):Это все хорошо, но не понятно замер был работающей программы в режиме отладки или нет?
Burster_TIL писал(а):скалогрыз писал(а):если замеры ведутся функцией RDTSC то нужно сразу же показывать листинг assembler-а из Delphi и FPC, без лишних вопросов.
Да без проблем. Ассемблерная процедура RDTSC вызывается всего 2 раза и из всего вычислительного процесса почти ничего сжирать не должна.
Burster_TIL писал(а):FUNCTION RDTSC_Int64:Int64; //Тоже самое в DelphiBegin 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;
если же убрать фц-ию HexToSymbol и оставить просто цикл, то Delphi даёт 1965 а FPC 6753.
Pavia писал(а):Это не тоже самое. А черти что и сбоку бантик. Вы возвращаете левую и скорее всего не инициируемую переменную.
Pavia писал(а):В Delphi это не с компилируется.
Pavia писал(а):Брехня. Если убрать то компиляторы просто выкинут цикл.
В FPC вы оптимизатор не включили. Либо забыли перекомпилить весь код, вместо этого провели его сборку.
скалогрыз писал(а):да не процедуры листинг (т.к. одинакова будет для обоих компиляторов) ,а циклов
включая реализации HEXToSymbol
Burster_TIL писал(а):Компилировал стандартно Ctrl+F9. То есть компилируется и после этого запускается.
MiniQ писал(а):Запуск из под IDE не дает корректных результатов, т.к. запускается через отладчик. Попробуйте запустить в коммандной строке.
dcc32 project1.dpr
fpc project1.dpr
fpc -O3 project1.dpr
# FUNCTION HexToSymbol(b:Byte):Byte;
# if b<58 then HexToSymbol:=b-48;
403df4: 3c 3a cmp $0x3a,%al
403df6: 73 05 jae 0x403dfd
403df8: 8b d0 mov %eax,%edx
403dfa: 80 ea 30 sub $0x30,%dl
# if b>64 then HexToSymbol:=b-55;
403dfd: 3c 40 cmp $0x40,%al
403dff: 76 05 jbe 0x403e06
403e01: 8b d0 mov %eax,%edx
403e03: 80 ea 37 sub $0x37,%dl
403e06: 8b c2 mov %edx,%eax
403e08: c3 ret
# end
...
# T1:=Get__RDTSC
403e6d: e8 7e ff ff ff call 0x403df0
403e72: 89 05 5c 56 40 00 mov %eax,0x40565c
403e78: 89 15 60 56 40 00 mov %edx,0x405660
# for i:=0 to 1000 do
403e7e: bb e9 03 00 00 mov $0x3e9,%ebx
# B:=HEXToSymbol(100);
403e83: b0 64 mov $0x64,%al
403e85: e8 6a ff ff ff call 0x403df4
403e8a: 4b dec %ebx
403e8b: 75 f6 jne 0x403e83
# T2:=Get__RDTSC
403e8d: e8 5e ff ff ff call 0x403df0
P$PROJECT2_HEXTOSYMBOL$BYTE$$BYTE:
# Temps allocated between ebp-8 and ebp-8
# [11] Begin
pushl %ebp
movl %esp,%ebp
subl $8,%esp
# Var b located at ebp-4
# Var $result located at ebp-8
movb %al,-4(%ebp)
# [12] if b<58 then HexToSymbol:=b-48;
movzbl -4(%ebp),%eax
cmpl $58,%eax
jl .Lj7
jmp .Lj8
.Lj7:
movzbl -4(%ebp),%eax
subl $48,%eax
movb %al,-8(%ebp)
.Lj8:
# [13] if b>64 then HexToSymbol:=b-55;
movzbl -4(%ebp),%eax
cmpl $64,%eax
jg .Lj11
jmp .Lj12
.Lj11:
movzbl -4(%ebp),%eax
subl $55,%eax
movb %al,-8(%ebp)
.Lj12:
# [14] End;
movb -8(%ebp),%al
leave
ret
...
# [22] T1:=Get__RDTSC; //RDTSC_Int64;
call P$PROJECT2_GET__RDTSC$$INT64
movl %eax,U_P$PROJECT2_T1
movl %edx,U_P$PROJECT2_T1+4
# [23] for i:=0 to 1000 do
movw $0,U_P$PROJECT2_I
decw U_P$PROJECT2_I
.balign 4,0x90
.Lj19:
incw U_P$PROJECT2_I
# [25] B:=HEXToSymbol(100);
movb $100,%al
call P$PROJECT2_HEXTOSYMBOL$BYTE$$BYTE
movb %al,U_P$PROJECT2_B
cmpw $1000,U_P$PROJECT2_I
jl .Lj19
# [27] T2:=Get__RDTSC; // RDTSC_Int64;
call P$PROJECT2_GET__RDTSC$$INT64
# Temps allocated between esp+0 and esp+0
# Var b located in register al
# Var $result located in register dl
# [12] if b<58 then HexToSymbol:=b-48;
movzbl %al,%edx
cmpl $58,%edx
jnl .Lj8
movzbl %al,%edx
subl $48,%edx
.Lj8:
# [13] if b>64 then HexToSymbol:=b-55;
movzbl %al,%ecx
cmpl $64,%ecx
jng .Lj12
andl $255,%eax
subl $55,%eax
movb %al,%dl
.Lj12:
# [14] End;
movb %dl,%al
ret
...
# [22] T1:=Get__RDTSC; //RDTSC_Int64;
call P$PROJECT2_GET__RDTSC$$INT64
movl %eax,-4(%ebp)
movl %edx,%ebx
# [23] for i:=0 to 1000 do
movw $0,%si
decw %si
.balign 4,0x90
.Lj19:
incw %si
# [25] B:=HEXToSymbol(100);
movb $100,%al
call P$PROJECT2_HEXTOSYMBOL$BYTE$$BYTE
movb %al,-8(%ebp)
cmpw $1000,%si
jl .Lj19
# [27] T2:=Get__RDTSC; // RDTSC_Int64;
call P$PROJECT2_GET__RDTSC$$INT64
скалогрыз писал(а):Вывод - бросать этот поганый FPC и писать под x86_64 и линуксы на Delphi 7
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4