Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.03.2013, 13:02
Аватар для vvvch
vvvch vvvch вне форума
Прохожий
 
Регистрация: 28.03.2012
Адрес: г.Боровичи, Новг. обл.
Сообщения: 19
Версия Delphi: Lazarus
Репутация: 10
По умолчанию Помогите пожалуйста с профилированием

Я не большой специалист в программировании и много не знаю. Сделал две функции (метода) одна на паскале, другая на ассемблере. Они почти одинаковые, делают одно и то-же (вычисляют контрольную сумму (СRС16) для Modbus) Они работают правильно - я проверял, но... Я не знаю стоит-ли использовать ассемблер для ускорения или не заморачиваться с этим и делать на паскале. Когда - то, я помню, время выполнения пожно было выяснить профилированием, но это под дос, а сейчас у меня таких инструментов нет. Вот я и привожу текст функций, если у кого он(профайлер) есть выясните пожалуйста стоит ли использовать паскаль или ассемблер версию (или это всё равно). Функция будет вызываться очень часто, параметром будет буфер не более 100 байт (очень редко больше).
Вот функции:
Код:
function TfCalcCRC.CalcCRC(var buf : array of byte; const len : integer) : word;
  // CRC = $CB72   $0924
type
  TWord = record
    lo, hi  : byte
  end;
var
  i : integer;
  j : byte;
const
  CRC_st = $FFFF;
  CRC_1  = $A001;
begin
  Result := CRC_st;
  for i := 0 to len - 1 do
  begin
    TWord(Result).lo := TWord(Result).lo xor Buf[i];
    for j := 0 to 7 do
      if boolean(Result and 1) then
        Result := (Result shr 1) xor CRC_1
      else
        Result := Result shr 1;
  end;
end;

{$ASMMODE intel}
//{$OUTPUT_FORMAT BASM}
function TfCalcCRC.CalcCRCasm(var buf : array of byte; const len : integer) : word;
  assembler;
const
  CRC_st = $FFFF;
  CRC_1  = $A001;
asm
   //EDX - Указывает на передаваемые параметры
   //Можно менять EAX ECX ??EDX
   //Сохранить в стэке EBX ESI EDI ESP EBP не менять DS ES SS CS FS GS
   PUSH ESI
   MOV     AX, CRC_st  //AX - Result
   XOR     ESI, ESI    //ESI - цикл по буферу 0,1,2...len-1
@loop1:
   XOR     AL, byte ptr [buf+ESI] //TWord(Result).lo := TWord(Result).lo xor Buf[i];
   MOV CX, 8 //цикл 8 раз
@loop2:
   //if boolean(Result and 1) then
   TEST AX, 1 //and с установкой флагов без изменения акамулятора
   JZ @m1 //Переход если 0
   SHR AX, 1 //Result := (Result shr 1) xor CRC_1
   XOR AX, CRC_1
   JMP @m2
@m1: // Result := Result shr 1;
   SHR AX, 1
@m2:
   LOOP @loop2
   INC     ESI                // Организуем т.о
   CMP     ESI, dword ptr len // цикл по буферу
   JB      @loop1              // --------------
   //в AX -  результат
   //
   pop ESI
end;                            
Я не большой специалист в программировании, по этому если увидите ошибки (а их наварно не мало) сообщите.
Для профилирования я написал небольшую отладочную програмку но она на Lazarus (впрочем это не важно ассемблер вроде не использует ничего, что не работало бы под Delphi). Файл я приложил.
Очень прошу - помогите.
Вложения
Тип файла: rar CRC.rar (125.2 Кбайт, 1 просмотров)
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter