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

Вниз

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

 
Riply ©   (2006-11-15 20:02) [0]

- "потому что не хочет !"
Смотрела Его Святейшество Генофонд и у меня возникла пара вопросов:
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 и на один оператор присваивания меньше.


 
chose ©   (2006-11-15 22:28) [1]

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


 
DrPass ©   (2006-11-15 23:43) [2]


> Riply ©   (15.11.06 20:02)  

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


 
KilkennyCat ©   (2006-11-15 23:53) [3]

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


 
Riply ©   (2006-11-16 01:12) [4]

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


 
sniknik ©   (2006-11-16 01:30) [5]

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

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


 
Riply ©   (2006-11-16 02:11) [6]

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


 
Loginov Dmitry ©   (2006-11-16 07:36) [7]

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


 
Anatoly Podgoretsky ©   (2006-11-16 08:55) [8]


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

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


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


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


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


 
Riply ©   (2006-11-16 21:18) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
2-1163506756
megasecure
2006-11-14 15:19
2006.12.03
Рисование с пом. Polyline


2-1163481093
Владимир__
2006-11-14 08:11
2006.12.03
Как сделать PLUG IN?


15-1163183082
ArtemESC
2006-11-10 21:24
2006.12.03
Технология баннированя IP-адресов...


5-1144675303
solenko
2006-04-10 17:21
2006.12.03
Выравнивание по левому краю в TEdit


15-1163071039
SpellCaster
2006-11-09 14:17
2006.12.03
Посоветуйте DVD-RW