Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизОптимизация кода Найти похожие ветки
← →
Вопрос (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c