Модератор: Модераторы
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1