Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация кода


Вопрос ©   (2004-08-09 17:34:00) 

есть функция подсчета контрольой суммы, как можно уменьшить ее время выполнения
function ControlSumm(ArrayOfByte: array of byte): string;
var
 i, TempResult: integer;
begin
 TempResult:=ArrayOfByte[0] xor ArrayOfByte[1];
 for i:=2 to 21 do
   TempResult:=TempResult xor ArrayOfByte[i];
 result:=IntToHex(TempResult,2);
end;


Erik1   (2004-08-10 10:46:00) [1]

Помоему табличные варианты быстрее.
function crc32 (crc : uLong; buf : pBytef; len : uInt): uLong;
begin
 if (buf = Z_NULL) then
   crc32 := Long(0)
 else
 begin

{$IFDEF DYNAMIC_CRC_TABLE}
   if crc_table_empty then
     make_crc_table;
{$ENDIF}

   crc := crc xor uLong($ffffffff);
   while (len >= 8) do
   begin
     {DO8(buf)}
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);

     Dec(len, 8);
   end;
   if (len <> 0) then
   repeat
     {DO1(buf)}
     crc := crc_table[(int(crc) xor buf^) and $ff] xor (crc shr 8);
     inc(buf);

     Dec(len);
   until (len = 0);
   crc32 := crc xor uLong($ffffffff);
 end;
end;


Alx2   (2004-08-09 20:26:00) [2]

Вот еще в четыре раза быстрее вариант:

 Function ControlSumm(Const ArrayOfByte: TByteArray): String;
 Const ToHex : array [0..15] of char = ('0','1','2','3','4','5','6',
                                      '7','8','9','A','B','C','D','E','F');
 Var
   TempResult: Integer;
 Begin
   TempResult := Integer((@ArrayOfByte[0])^) Xor Integer((@ArrayOfByte[4])^) Xor Integer((@ArrayOfByte[8])^)
     Xor Integer((@ArrayOfByte[12])^) Xor Integer((@ArrayOfByte[16])^);
   TempResult := (TempResult And $FFFF) Xor ((TempResult Shr 16)) Xor (Word((@ArrayOfByte[20])^));
   TempResult := (TempResult And $FF) Xor (TempResult Shr 8);
   SetLength(Result,2);
   Result[1] := ToHex[TempResult shr 4];
   Result[2] := ToHex[TempResult and $F];
 End;


Alx2   (2004-08-09 19:16:00) [3]

>Вопрос   (09.08.04 17:34)  
Вот так должно быть много быстрее:

Type TByteArray = Array[0..21] Of Byte;
 Function ControlSumm(Const ArrayOfByte: TByteArray): String;
 Var
   TempResult: Integer;
 Begin
   TempResult := Integer((@ArrayOfByte[0])^) Xor Integer((@ArrayOfByte[4])^) Xor Integer((@ArrayOfByte[8])^)
     Xor Integer((@ArrayOfByte[12])^) Xor Integer((@ArrayOfByte[16])^);
   TempResult := (TempResult And $FFFF) Xor ((TempResult Shr 16)) Xor (Word((@ArrayOfByte[20])^));
   TempResult := (TempResult And $FF) Xor (TempResult Shr 8);
   Result := IntToHex(TempResult, 2);
 End;


Sandman25   (2004-08-09 17:43:00) [4]

С const будет передаваться только адрес массива, без const весь массив будет записываться в стек. Из-за этого и тормоза.


Вопрос   (2004-08-09 17:42:00) [5]

To Sandman25 ©   (09.08.04 17:36) [2]
 почему


Sandman25   (2004-08-09 17:36:00) [6]

кстати, очень не хватает слова constв описании параметра


Sandman25   (2004-08-09 17:35:00) [7]

IntToHex(ArrayOfByte[0] xor ArrayOfByte[1] ... xor ArraOfByte[21])


Наверх

Титульная страница Поиск, карта сайта Написать письмо