Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1163706435
Колдун
2006-11-16 22:47
2006.12.03
Конвертация аудио


3-1159279225
Itonix
2006-09-26 18:00
2006.12.03
Динамический запрос


15-1163456184
константинов
2006-11-14 01:16
2006.12.03
Флэшки. USB port


2-1163694118
KurtCobain
2006-11-16 19:21
2006.12.03
Переменные в DLL


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский