Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы из разряда "Почему верблюд не ест вату ?"


Riply ©   (2006-11-15 20:02:00) 

- "потому что не хочет !"
Смотрела Его Святейшество Генофонд и у меня возникла пара вопросов:
function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
 L, H, I, C: Integer;
begin
 Result := False;
 L := 0;
 H := FCount - 1;
 while L <= H do
 begin
   I := (L + H) shr 1;
   C := CompareStrings(FList^[I].FString, S);
   if C < 0 then L := I + 1 else
   begin
     H := I - 1;
     if C = 0 then
     begin
       Result := True;
       if Duplicates <> dupAccept then L := I;
     end;
   end;
 end;
 Index := L;
end;

Чем Break не устроил, что ему предпочли линнее сравнение L <= H и
лишнее присваивание H := I - 1; ?
Почему не сделано так:
function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
 L, H, I, C: Integer;
begin
 Result := False;
 L := 0;
 H := FCount - 1;
 while L <= H do
 begin
   I := (L + H) shr 1;
   C := CompareStrings(FList^[I].FString, S);
   if C < 0 then L := I + 1 else
    if C > 0 then H := I - 1 else
     begin
      Result := True;
      if Duplicates <> dupAccept then L := I;
      Break;
     end;
 end;
 Index := L;
end;

И зачем вводить лишнюю переменную L, когда вместо нее можно
использовать Index и на один оператор присваивания меньше.


Riply   (2006-11-16 21:18:00) [1]

> [9] Игорь Шевченко ©   (16.11.06 12:07)
Да, прозевала - разное.
Спасибо всем огромное! Теперь все объяснено и "моя душенька довольна" :)


Игорь Шевченко   (2006-11-16 12:07:00) [2]


> Чем Break не устроил


Будет разное поведение при дубликатах строк. Проверь ?


Anatoly Podgoretsky   (2006-11-16 08:55:00) [3]


> А если это во вложенном цикле ?

И в нем тоже, ровно столько же.


Loginov Dmitry   (2006-11-16 07:36:00) [4]

Да уж :)
Рядом с CompareStrings кокое-то лишнее условие ну никак не скажется на производительности.


Riply   (2006-11-16 02:11:00) [5]

>[5] sniknik ©   (16.11.06 01:30)
Спасибо ! С переменной стало понятно.
А Break ? Почему вместо него выбирают лишнее присваивание и сравнение ?


sniknik   (2006-11-16 01:30:00) [6]

"лишняя" переменная которую компилятор скорее всего в регистр запихнет, а к "экономному" Index еще и по ссылке обращается придется, т.к. var, что значит не просто переменная, а указатель на нее.

вообще конечно не факт что оптимизатор не сведет и более тяжеловесный вариант со ссылкой к тому же с регистром... но это будет уже не заслуга программиста...
надо смотреть получающийся код скомпиленного, для уточнений.


Riply   (2006-11-16 01:12:00) [7]

>Что он экономит несколько байт из миллиарда имеющихся?
А если это во вложенном цикле ?
Я исходила из того, что раз так сделано
(например, введена "лишняя" переменная), значит есть
некоторые соображения, недоступные моему пониманию.
Поэтому и задала вопрос.


KilkennyCat   (2006-11-15 23:53:00) [8]

читаемость у оригинала лучше, ибо я сразу вижу три состояния, > < и =. В предложенном варианте мне приходится работать компилятором больше. на скорость работы скомпилированного вряд ли повлияет. Прелагаю привести автору ассемблерный вариант после компиляции.


DrPass   (2006-11-15 23:43:00) [9]


> Riply ©   (15.11.06 20:02)  

ммм... а чем предложенный тобой вариант лучше? Что он экономит несколько байт из миллиарда имеющихся?


chose   (2006-11-15 22:28:00) [10]

"Так надо" (ц)


Наверх

Титульная страница Поиск, карта сайта Написать письмо