![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы из разряда "Почему верблюд не ест вату ?"
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]"Так надо" (ц)