Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизВопросы из разряда "Почему верблюд не ест вату ?" Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c