Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1258960395
desc
2009-11-23 10:13
2010.03.21
Длинные имена файлов


1-1240160543
Cobalt
2009-04-19 21:02
2010.03.21
Отчего ошибка при сравнении Variant?


15-1262122222
Юрий
2009-12-30 00:30
2010.03.21
С днем рождения ! 30 декабря 2009 среда


2-1263756018
Jimmy
2010-01-17 22:20
2010.03.21
Замена цветов


2-1263479756
0990
2010-01-14 17:35
2010.03.21
Модальные формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский