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

Вниз

Интересный код   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1263955273
Soi
2010-01-20 05:41
2010.03.21
Вставка записей в БД циклом


1-1243939536
Skyhawk
2009-06-02 14:45
2010.03.21
Верхний регистр


2-1263819343
Alexey
2010-01-18 15:55
2010.03.21
Размер большой папки


4-1231029490
olevacho_
2009-01-04 03:38
2010.03.21
Просмотр напечатанных страниц


1-1243853899
SergejM
2009-06-01 14:58
2010.03.21
Медленная работа TJvRichEdit при PlainText:=true