Форум: "Основная";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
ВнизИнтересный код Найти похожие ветки
← →
Unknown user © (2009-05-20 12:42) [0]Вот встретил в исходниках Delphi 2009 следующий код:
function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
var
I: Integer;
begin
Result := True;
if Length(Buffer) >= Length(Signature) then
begin
for I := 1 to Length(Signature) do
if Buffer[I - 1] <> Signature [I - 1] then
begin
Result := False;
Break;
end;
end
else
Result := False;
end;
Смутило, на мой взгляд, исскуственное усложнение. Я бы написал так:
function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
var
I: Integer;
begin
Result := False;
if Length(Buffer) < Length(Signature) then Exit;
for I := 0 to Length(Signature) - 1 do
if Buffer[I] <> Signature[I] then Exit;
Result := True;
end;
Где я проглядел тайный смысл?
← →
Slym © (2009-05-20 12:50) [1]Unknown user © (20.05.09 12:42)
есть на паvяли косяк с циклом i:cardinal;
цикл for I := 0 to Length(Signature) - 1 do надолго зациклится при
Length(Signature) =0
но тут i:Integer и с ним это не канает
← →
Slym © (2009-05-20 12:55) [2]Unknown user © (20.05.09 12:42)
меня больше смущает что в век 32бит и в скорем времени 64...
сравнение памяти реализуется побайтно по 8 бит
← →
Palladin © (2009-05-20 12:58) [3]
Function ContainsPreamble(const Buffer, Signature: TBytes): Boolean;
Begin
If Length(Buffer) < Length(Signature)
Then Result := False
Else Result:=CompareMem(@Buffer[0],@Signature[0],Length(Signature));
End;
а удивлятся нечему, двоешники есть везде...
← →
Unknown user © (2009-05-20 13:03) [4]>а удивлятся нечему, двоешники есть везде...
Эта функция оптимизирована по быстродействию. Может здесь причина? Все направлено на получение быстрого ассемблерного кода?
← →
Slym © (2009-05-20 13:11) [5]Unknown user © (20.05.09 13:03) [4]
быстродействие при Length(Signature)<определенного числа допустим 64, на всем прочем отставание в разы
← →
Unknown user © (2009-05-20 13:14) [6]>быстродействие при Length(Signature)<определенного числа допустим 64, на всем прочем отставание в разы
оно так и есть, Signature - это сигнатура кодовой страницы, двухбайтная.
← →
Slym © (2009-05-20 13:19) [7]Unknown user © (20.05.09 13:14) [6]
тогда нафега городить динамомошину если размер известен заранее?function ContainsPreamble(const Buffer:TBytes;Signature: word): Boolean;
begin
Result := False;
if Length(Buffer) < Length(Signature) then Exit;
Result := (PWord(@Buffer[0])^=Signature);
end;
и стек не двигаем и циклов нету
← →
Игорь Шевченко © (2009-05-20 17:28) [8]
> function ContainsPreamble(const Buffer:TBytes;Signature:
> word): Boolean;
> begin
> Result := False;
> if Length(Buffer) < Length(Signature) then Exit;
> Result := (PWord(@Buffer[0])^=Signature);
> end;
писатели...
Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);
За Exit - убивать сразу
← →
Slym © (2009-05-21 04:49) [9]Игорь Шевченко © (20.05.09 17:28) [8]
непомню свойства проекта влияют на генофонд, но при опции {$B+} получим что?
получим тоже что и в [8] но независимо от опций компиляцииfunction ContainsPreamble(const Buffer:TBytes;Signature: word): Boolean;
begin
if Length(Buffer) < Length(Signature) then
Result := False
else
Result := (PWord(@Buffer[0])^=Signature);
end;
← →
Cobalt © (2009-05-21 15:19) [10]> Игорь Шевченко © (20.05.09 17:28) [8]
>
> > function ContainsPreamble(const Buffer:TBytes;Signature:
>
> > word): Boolean;
> > begin
> > Result := False;
> > if Length(Buffer) < Length(Signature) then Exit;
> > Result := (PWord(@Buffer[0])^=Signature);
> > end;
>
> писатели...
>
> Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);
>
> За Exit - убивать сразу
Игорь, поясните, по какой причине Exit тут не подходит?
← →
Palladin © (2009-05-21 15:29) [11]По сугубо религиозной, ноги которой из goto растут ;)
← →
Anatoly Podgoretsky © (2009-05-21 15:39) [12]
> Игорь, поясните, по какой причине Exit тут не подходит?
Не структурно.
> if Length(Buffer) >= Length(Signature) then
> Result := (PWord(@Buffer[0])^=Signature);
← →
Anatoly Podgoretsky © (2009-05-21 16:06) [13]Сообственно у Игоря юольше написано, без лишних присвоений и выходов, в один оператора.
Result := (Length(Buffer) >= Length(Signature)) and (PWord(@Buffer[0])^=Signature);
Мой код только пример реструктизации Exit и учитывает различие настроек компилятора. При желании добавить ветку ELSE
← →
Игорь Шевченко © (2009-05-21 21:35) [14]Slym © (21.05.09 04:49) [9]
> непомню свойства проекта влияют на генофонд
не влияют.
Anatoly Podgoretsky © (21.05.09 15:39) [12]
Ну да, про Complete Boolean Evaluation я не подумал, потому как привык, что он всегда отключен.
← →
Дмитрий Белькевич (2009-05-29 15:56) [15]
> За Exit - убивать сразу
А как же with ;) ?
← →
Игорь Шевченко © (2009-05-29 16:29) [16]Дмитрий Белькевич (29.05.09 15:56) [15]
Заметь - я не говорю "не используйте", я говорю "убивать". Это называется чисткой генофонда :)
← →
Anatoly Podgoretsky © (2009-05-30 00:34) [17]
> Дмитрий Белькевич (29.05.09 15:56) [15]
А до него уже дело не дойдет в этом случае, если действовать последовательно.
← →
Германн © (2009-05-31 01:24) [18]
> Игорь Шевченко © (29.05.09 16:29) [16]
>
> Дмитрий Белькевич (29.05.09 15:56) [15]
>
> Заметь - я не говорю "не используйте", я говорю "убивать".
> Это называется чисткой генофонда :)
>
Странно однако! Когда за "чистку генофонда" ратует кто-другой (например sniknik), ты против. Хотя Николай предлагает его (генофонд) "чистить" в гораздо более явных и насущных случаях!
P.S. Я, лично, ни от Exit, ни тем более от with не вижу причины отказываться столь радикально.
← →
Германн © (2009-06-01 01:00) [19]P.P.S.
Забыл вчера поставить смайлик в своём сообщении. Но от постскриптума не отказываюсь.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c