![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация кода
Вопрос © (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])