Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Оптимизация кода   Найти похожие ветки 

 
Вопрос   (2004-08-09 17:34) [0]

есть функция подсчета контрольой суммы, как можно уменьшить ее время выполнения
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;


 
Sandman25 ©   (2004-08-09 17:35) [1]

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


 
Sandman25 ©   (2004-08-09 17:36) [2]

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


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

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


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

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


 
Alx2 ©   (2004-08-09 19:16) [5]

>Вопрос   (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;


 
Alx2 ©   (2004-08-09 20:26) [6]

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

 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;


 
Erik1   (2004-08-10 10:46) [7]

Помоему табличные варианты быстрее.
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;



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
3-1091096115
otistarda
2004-07-29 14:15
2004.08.22
Создание ADOConnection


1-1091628699
Moss
2004-08-04 18:11
2004.08.22
Распознавание символов


3-1090845068
TAN_K
2004-07-26 16:31
2004.08.22
Размер поля - IBExpert


14-1091513884
Narat
2004-08-03 10:18
2004.08.22
RX components for Delphi 8


9-1082036082
istemy
2004-04-15 17:34
2004.08.22
Как сделать так, чтобы герой не проходил стены?